我有一个如下所示的 Pandas 数据框:
A B C D
0 7 2 5 2
1 3 3 1 1
2 0 2 6 1
3 3 6 2 9
可以有100列,在上面的示例中,我仅显示了4。
我想为每行及其值提取top-k列。
我可以使用以下方法获取前k个列:
pd.DataFrame({n: df.T[column].nlargest(k).index.tolist() for n, column in enumerate(df.T)}).T
对于k = 3,得出:
0 1 2
0 A C B
1 A B C
2 C B D
3 D B A
但是我想拥有的是:
0 1 2 3 4 5
0 A 7 C 5 B 2
1 A 3 B 3 C 1
2 C 6 B 2 D 1
3 D 9 B 6 A 3
是否有一种灵巧的方法来实现这一目标?
最佳答案
您可以使用numpy
解决方案:
numpy.argsort
用于列名称values by indices
interweave
用于新数组DataFrame
构造函数k = 3
vals = df.values
arr1 = np.argsort(-vals, axis=1)
a = df.columns[arr1[:,:k]]
b = vals[np.arange(len(df.index))[:,None], arr1][:,:k]
c = np.empty((vals.shape[0], 2 * k), dtype=a.dtype)
c[:,0::2] = a
c[:,1::2] = b
print (c)
[['A' 7 'C' 5 'B' 2]
['A' 3 'B' 3 'C' 1]
['C' 6 'B' 2 'D' 1]
['D' 9 'B' 6 'A' 3]]
df = pd.DataFrame(c)
print (df)
0 1 2 3 4 5
0 A 7 C 5 B 2
1 A 3 B 3 C 1
2 C 6 B 2 D 1
3 D 9 B 6 A 3
关于python - 每行Pandas数据框中具有前k个列的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42533883/