根据最后一列和最后一行的总和查找前 5 个值

alm*_*lmo 5 python dataframe pandas

我想根据具有超过 20,000 行和 200 列的表集中的最后一列和最后一行的总和找到最高和最低的 5 个值。(这是一个多标签问题)。原始表没有列和行的总和。我自己添加了总和值)。在此处查看玩具数据集:

 import pandas as pd

 data = {'index': ['0001 ','0002 ','0003 ','0004 ','0005 ','0006 
    ','0007','0008','0009','0010','0011'],
    'factor1': [0,1,0,1,0,0,1,0,0,0,1],
    'factor2': [1,0,0,1,0,0,0,1,1,1,1], 
    'factor3': [1,1,1,1,0,0,0,1,1,0,1],
    'factor4': [0,1,1,1,0,0,1,1,0,0,1],
    'factor5': [1,1,1,1,0,0,0,1,1,1,1], 
    'factor6': [1,0,0,0,0,0,0,1,1,1,1],
    'factor7': [0,1,1,1,1,0,1,1,0,0,1],
    'factor8': [1,1,1,1,1,1,0,1,1,1,1], 
    'factor9': [1,0,0,0,0,0,0,0,0,0,0],
    }

    df = pd.DataFrame(data,columns=['index','factor1','factor2','factor3','factor4','factor5','factor6','factor7','factor8','factor9'])
    count_row = df.count(axis=1)
    df
Run Code Online (Sandbox Code Playgroud)

这是生成的表:

index   factor1 factor2 factor3 factor4 factor5 factor6 factor7 factor8 factor9
0   0001    0     1       1        0      1      1       0       1        1
1   0002    1     0       1        1      1      0       1       1        0
2   0003    0     0       1        1      1      0       1       1        0
3   0004    1     1       1        1      1      0       1       1        0
4   0005    0     0       0        0      0      0       1       1        0
5   0006    0     0       0        0      0      0       0       1        0 
6   0007    1     0       0        1      0      0       1       0        0
7   0008    0     1       1        1      1      1       1       1        0
8   0009    0     1       1        0      1      1       0       1        0
9   0010    0     1       0        0      1      1       0       1        0
10  0011    1     1       1        1      1      1       1       1        0
Run Code Online (Sandbox Code Playgroud)

使用此代码,我得到了每列和每行的总和

classSum=df.sum(axis=0) 
df["sum"] =df.sum(axis=1)
df =df.append(classSum,ignore_index=True)
rowSum=df.sum(axis=1)
df.at[11,'index']='Nan'
df
Run Code Online (Sandbox Code Playgroud)

列和行中有总和的表:

    index   factor1 factor2 factor3 factor4 factor5 factor6 factor7 factor8 factor9 sum
  0  0001     0        1       1       0       1       1       0       1       1    6.0
  1  0002     1        0       1       1       1       0       1       1       0    6.0
  2  0003     0        0       1       1       1       0       1       1       0    5.0
  3  0004     1        1       1       1       1       0       1       1       0    7.0
  4  0005     0        0       0       0       0       0       1       1       0    2.0
  5  0006     0        0       0       0       0       0       0       1       0    1.0
  6  0007     1        0       0       1       0       0       1       0       0    3.0
  7  0008     0        1       1       1       1       1       1       1       0    7.0
  8  0009     0        1       1       0       1       1       0       1       0    5.0
  9  0010     0        1       0       0       1       1       0       1       0    4.0
  10 0011     1        1       1       1       1       1       1       1       0    8.0
  11 Nan      4        6       7       6       8       5       7       10      1    NaN
Run Code Online (Sandbox Code Playgroud)

注意:第 11 行是总和行

我想要这样的结果:

基于行: - 前五个值的输出如下所示:

  factor 8 :10
  factor 5 : 8 
  factor 3 : 7
  factor 7 : 7
  factor 4 : 6
Run Code Online (Sandbox Code Playgroud)

基于列:

- 输出前 5 个值如下所示:

 0011 :8
 0008 :7
 0004 :7
 0001 :6
 0002 :6
Run Code Online (Sandbox Code Playgroud)

总和中有相同的值。只是忽略它。

那么我该怎么做呢?谢谢!

Erf*_*fan 5

从您的原始数据开始,因此没有总和列,我们可以使用DataFrame.sum来获取每列或每行 ( axis=1)的总和,然后我们将结果链接Series.nlargest到前 5 个。

df = df.set_index('index')
Run Code Online (Sandbox Code Playgroud)

前 5 列:

df.sum().nlargest(5)

factor8    10
factor5     8
factor3     7
factor7     7
factor2     6
dtype: int64
Run Code Online (Sandbox Code Playgroud)

前 5 行:

df.sum(axis=1).nlargest(5)

index
0011     8
0004     7
0008     7
0001     6
0002     6
dtype: int64
Run Code Online (Sandbox Code Playgroud)

如果您确实想要字典,请使用以下链接解决方案to_dict

df.sum().nlargest(5).to_dict()

{'factor8': 10, 'factor5': 8, 'factor3': 7, 'factor7': 7, 'factor2': 6}
Run Code Online (Sandbox Code Playgroud)

要绘制结果,请使用DataFrame.plot.bar

df.sum().nlargest(5).plot.bar(figsize=(12,8))
Run Code Online (Sandbox Code Playgroud)

条形图