微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 前k个列,每行包含pandas数据帧中的值

我有一个像下面这样的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列.

我可以使用以下方法获得top-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

是否有一个pand(a)oic方式来实现这一目标?

解决方法:

你可以使用numpy解决方案:

> numpy.argsort名称
>阵列已经排序(谢谢Jeff),需要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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐