仅保留数据框中每行的前 N 个值,并将其他设置为零
Only keep the top N values of each row in dataframe and set other to zero
我试图为每个 date/row 保留前 3 个值,并将所有其他值设置为零。
我创建了一个示例数据框:
import pandas as pd
df1 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':[0, 1.2, 0.3, 2],
'02K W':[0.5, 2, 1.4, 3],
'03K W':[2, 1.6, 3, 5],
'04K W':[7, 0.5, 2.4, 5],
'05K W':[4, 2, 4.5, 1],
'06K W':[2.7, 0, 0, 0],
'07K W':[4, 3, 3, 2],
'08K W':[3.8, 1, 9, 2],
'09K W':[1, 4, 0.4, 6.3],
'10K W':[0, 0, 9, 5.6]})
df1 = df1.set_index('Date')
我努力调整 apply
函数以获得前 n 个值而不是最大值。我用 nlargest
尝试过,但随后出现错误:Can only compare identically-labeled Series objects.
df1.apply(lambda x: x == x.max(), axis=1)
但我想得到的是:
df2 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':[0, 0, 0, 0],
'02K W':[0, 2, 0, 0],
'03K W':[0, 0, 0, 5],
'04K W':[7, 0, 0, 5],
'05K W':[4, 2, 4.5, 0],
'06K W':[0, 0, 0, 0],
'07K W':[4, 3, 0, 0],
'08K W':[0, 0, 9, 0],
'09K W':[0, 4, 0, 6.3],
'10K W':[0, 0, 9, 5.6]})
df2 = df2.set_index('Date')
非常感谢
DataFrame.rank
沿列轴对行进行降序排列,然后 mask
排名为 > 3
的值
df1.mask(df1.rank(axis=1, method='min', ascending=False).gt(3), 0)
01K W 02K W 03K W 04K W 05K W 06K W 07K W 08K W 09K W 10K W
Date
2021-01-01 0.0 0.0 0.0 7.0 4.0 0.0 4 0.0 0.0 0.0
2021-01-02 0.0 2.0 0.0 0.0 2.0 0.0 3 0.0 4.0 0.0
2021-01-03 0.0 0.0 0.0 0.0 4.5 0.0 0 9.0 0.0 9.0
2021-01-04 0.0 0.0 5.0 5.0 0.0 0.0 0 0.0 6.3 5.6
我试图为每个 date/row 保留前 3 个值,并将所有其他值设置为零。
我创建了一个示例数据框:
import pandas as pd
df1 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':[0, 1.2, 0.3, 2],
'02K W':[0.5, 2, 1.4, 3],
'03K W':[2, 1.6, 3, 5],
'04K W':[7, 0.5, 2.4, 5],
'05K W':[4, 2, 4.5, 1],
'06K W':[2.7, 0, 0, 0],
'07K W':[4, 3, 3, 2],
'08K W':[3.8, 1, 9, 2],
'09K W':[1, 4, 0.4, 6.3],
'10K W':[0, 0, 9, 5.6]})
df1 = df1.set_index('Date')
我努力调整 apply
函数以获得前 n 个值而不是最大值。我用 nlargest
尝试过,但随后出现错误:Can only compare identically-labeled Series objects.
df1.apply(lambda x: x == x.max(), axis=1)
但我想得到的是:
df2 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':[0, 0, 0, 0],
'02K W':[0, 2, 0, 0],
'03K W':[0, 0, 0, 5],
'04K W':[7, 0, 0, 5],
'05K W':[4, 2, 4.5, 0],
'06K W':[0, 0, 0, 0],
'07K W':[4, 3, 0, 0],
'08K W':[0, 0, 9, 0],
'09K W':[0, 4, 0, 6.3],
'10K W':[0, 0, 9, 5.6]})
df2 = df2.set_index('Date')
非常感谢
DataFrame.rank
沿列轴对行进行降序排列,然后 mask
排名为 > 3
df1.mask(df1.rank(axis=1, method='min', ascending=False).gt(3), 0)
01K W 02K W 03K W 04K W 05K W 06K W 07K W 08K W 09K W 10K W
Date
2021-01-01 0.0 0.0 0.0 7.0 4.0 0.0 4 0.0 0.0 0.0
2021-01-02 0.0 2.0 0.0 0.0 2.0 0.0 3 0.0 4.0 0.0
2021-01-03 0.0 0.0 0.0 0.0 4.5 0.0 0 9.0 0.0 9.0
2021-01-04 0.0 0.0 5.0 5.0 0.0 0.0 0 0.0 6.3 5.6