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