首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >顶部k列,每一行的值以熊猫为单位

顶部k列,每一行的值以熊猫为单位
EN

Stack Overflow用户
提问于 2017-03-01 14:07:06
回答 3查看 2.8K关注 0票数 5

我有一只熊猫数据,如下所示:

代码语言:javascript
复制
   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列:

代码语言:javascript
复制
pd.DataFrame({n: df.T[column].nlargest(k).index.tolist() for n, column in enumerate(df.T)}).T

对于k=3,它给出了:

代码语言:javascript
复制
   0  1  2
0  A  C  B
1  A  B  C
2  C  B  D
3  D  B  A

但我想要的是:

代码语言:javascript
复制
   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

是否有和平(A)伊斯兰会议组织实现这一目标的途径?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-01 14:25:34

您可以使用numpy解决方案:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2017-03-01 14:41:31

代码语言:javascript
复制
>>> def foo(x):
...     r = []
...     for p in zip(list(x.index), list(x)):
...             r.extend(p)
...     return r
... 
>>> pd.DataFrame({n: foo(df.T[row].nlargest(k)) for n, row in enumerate(df.T)}).T
   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

或者,使用列表理解:

代码语言:javascript
复制
>>> def foo(x):
...     return [j for i in zip(list(x.index), list(x)) for j in i]
... 
>>> pd.DataFrame({n: foo(df.T[row].nlargest(k)) for n, row in enumerate(df.T)}).T
   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
票数 1
EN

Stack Overflow用户

发布于 2017-03-01 15:44:17

这有效地完成了工作:它使用了job分区,在O(n)中找到了最大的n,然后只对它们进行排序。

代码语言:javascript
复制
values=df.values
n,m=df.shape
k=4
I,J=mgrid[:n,:m]
I=I[:,:1]
if k<m: J=(-values).argpartition(k)[:,:k]
values=values[I,J]
names=np.take(df.columns,J)
J2=(-values).argsort()
names=names[I,J2]
values=values[I,J2]
names_and_values=np.empty((n,2*k),object)
names_and_values[:,0::2]=names
names_and_values[:,1::2]=values
result=pd.DataFrame(names_and_values)

代码语言:javascript
复制
   0  1  2  3  4  5
0  A  7  C  5  B  2
1  B  3  A  3  C  1
2  C  6  B  2  D  1
3  D  9  B  6  A  3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42533883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档