Python 选择矩阵上最高的行。

Python 选择矩阵上最高的行。,python,pandas,numpy,matrix,Python,Pandas,Numpy,Matrix,我有以下数据: 它是一个矩阵,如以下示例所示: UUID A B C D E F G H I 1.1 0 1 0 0 0 1 0 0 0 1.2 1 1 0 0 0 0 0 0 0 1.3 0 0 0 0 1 0 0 0 0 1.4 0 0 0 1 0 1 1 1 1 1.5 0 1 0 0 0

我有以下数据:

它是一个矩阵,如以下示例所示:

UUID  A   B   C   D   E   F   G   H   I  
1.1   0   1   0   0   0   1   0   0   0
1.2   1   1   0   0   0   0   0   0   0
1.3   0   0   0   0   1   0   0   0   0
1.4   0   0   0   1   0   1   1   1   1
1.5   0   1   0   0   0   0   1   0   0
1.6   0   0   1   0   0   0   1   0   0 
1.7   0   1   0   0   0   0   0   1   0 
1.8   0   0   1   0   0   0   1   0   0
1.9   0   1   0   0   0   0   1   0   1
我想创建一个新的矩阵,其中只包含50个最高的列(示例中为3个列)和相应的UUID。对于最高列,我指的是矩阵中有更多1的列

如果我不够清楚,请不要犹豫。多谢各位

IIUC

df[df.sum().nlargest(3).index]


排除n个最大值中所有零的行的步骤

n = df.sum().nlargest(3).index
df1 = df.loc[:, n]
df1[df1.eq(1).any(1)]


安装程序
带numpy的奖金解决方案 假设设置相同(这可能更快)

注意这些列与我的其他解决方案不同。这是因为多个列的总和为相同的值


时机
让我们把这项任务分成两部分。首先,找出哪些列包含最多的
1
。其次,只选择那些列

以下是一些数据:

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: import string

In [4]: data = np.random.randint(2, size=(10, 10))

In [5]: data
Out[5]:
array([[1, 1, 1, 1, 0, 1, 0, 0, 0, 0],
       [1, 1, 1, 1, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
       [0, 1, 0, 0, 1, 0, 0, 1, 1, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 1, 0],
       [0, 1, 0, 1, 1, 1, 0, 0, 1, 1],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [1, 1, 1, 1, 1, 0, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 0, 1, 1, 0, 1],
       [0, 0, 1, 1, 1, 0, 1, 0, 1, 1]]) 

In [6]: df = pd.DataFrame(data, columns=list(string.ascii_lowercase[:10]))

In [7]: df.index.name = 'uuid'

In [8]: df
Out[8]:
      a  b  c  d  e  f  g  h  i  j
uuid
0     1  1  1  1  0  1  0  0  0  0
1     1  1  1  1  0  1  0  0  0  0
2     0  0  0  1  1  1  0  0  0  0
3     0  1  0  0  1  0  0  1  1  0
4     0  0  0  1  0  0  0  0  1  0
5     0  1  0  1  1  1  0  0  1  1
6     0  0  1  1  1  1  1  1  0  0
7     1  1  1  1  1  0  1  1  1  1
8     0  0  1  1  1  0  1  1  0  1
9     0  0  1  1  1  0  1  0  1  1
现在,让我们查找
1
最多的列

In [9]: df.sum()
Out[9]:
a    3
b    5
c    6
d    9
e    7
f    5
g    4
h    4
i    5
j    4
dtype: int64

In [10]: df.sum().sort_values(ascending=False)
Out[10]:
d    9
e    7
c    6
i    5
f    5
b    5
j    4
h    4
g    4
a    3
dtype: int64
获取其中前3个的名称

In [11]: df.sum().sort_values(ascending=False).index[:3]
Out[11]: Index(['d', 'e', 'c'], dtype='object')
使用这些名称从原始数据框中选择列

In [12]: selection = df.sum().sort_values(ascending=False).index[:3]

In [13]: df[selection]
Out[13]:
      d  e  c
uuid
0     1  0  1
1     1  0  1
2     1  1  0
3     0  1  0
4     1  0  0
5     1  1  0
6     1  1  1
7     1  1  1
8     1  1  1
9     1  1  1

有没有办法让1.3不在该矩阵中?我得到了以下错误:“不能将方法'nlargest'与dtype对象一起使用”@pirsquaredi如果UUID恰好是一个浮点而不是一个字符串-不要忘记将其从这里的和中排除……在这种情况下,您可以执行类似于
df[df.ix[:,1::::.sum().nlargest(50).index.insert(0,'UUID')]
@AntonioLópezRuiz确保
UUID
是索引。如果不是,您可以执行
df.set\u index('UUID',inplace=True)
。如果您的
dtypes
是对象,那么您的值很可能是字符串。使用
df=df.astype(int)
转换它们,仍然不清楚。最高的穿过或向下的。
In [11]: df.sum().sort_values(ascending=False).index[:3]
Out[11]: Index(['d', 'e', 'c'], dtype='object')
In [12]: selection = df.sum().sort_values(ascending=False).index[:3]

In [13]: df[selection]
Out[13]:
      d  e  c
uuid
0     1  0  1
1     1  0  1
2     1  1  0
3     0  1  0
4     1  0  0
5     1  1  0
6     1  1  1
7     1  1  1
8     1  1  1
9     1  1  1