【问题标题】:Pandas groupby on one column witout losing others columns?Pandas groupby在一列上而不丢失其他列?
【发布时间】:2020-03-17 06:38:56
【问题描述】:

我对 groupby 和 pandas 有疑问,一开始我有这个图表:


import pandas as pd 

data = {'Code_Name':[1,2,3,4,1,2,3,4] ,'Name':['Tom', 'Nicko', 'Krish','Jack kr','Tom', 'Nick', 'Krishx', 'Jacks'],'Cat':['A', 'B','C','D','A', 'B','C','D'], 'T':[9, 7, 14, 12,4, 3, 12, 11]} 

# Create DataFrame 
df = pd.DataFrame(data) 
df

i have this : 
   Code_Name     Name Cat   T
0          1      Tom   A   9
1          2     Nick   B   7
2          3    Krish   C  14
3          4  Jack kr   D  12
4          1      Tom   A   4
5          2     Nick   B   3
6          3   Krishx   C  12
7          4    Jacks   D  11

现在我与 groupby :

df.groupby(['Code_Name','Name','Cat'],as_index=False)['T'].sum()

i got this:
   Code_Name     Name Cat   T
0          1      Tom   A  13
1          2     Nick   B  10
2          3    Krish   C  14
3          3   Krishx   C  12
4          4  Jack kr   D  12
5          4    Jacks   D  11

但对我来说,我需要这个结果:


   Code_Name   Name Cat   T
0          1    Tom   A  13
1          2   Nick   B  10
2          3  Krish   C  26
3          4   Jack   D  23


我不关心 Name Code_name 对我来说唯一重要的是总和 T 谢谢

【问题讨论】:

  • 所需的输出是df.groupby('Cat')['T'].sum(),但您按三列分组。你想如何处理不同的名字(即Krish vs Krishx)?
  • df.groupby(['Code_Name','Cat'],as_index=False)['T'].sum()

标签: python pandas dataframe


【解决方案1】:

或许你可以试试:

    (df.groupby("Code_Name", as_index=False)
       .agg({"Name":"first", "Cat":"first", "T":"sum"}))

原始答案见链接:https://datascience.stackexchange.com/questions/53405/pandas-dataframe-groupby-and-then-sum-multi-columns-sperately

【讨论】:

    【解决方案2】:

    有 2 种方法 - 为避免丢失的每一列添加聚合函数 - firstlast', '.join obviuosly 用于字符串列和聚合函数,如 summean 用于数字列:

    df = df.groupby('Code_Name',as_index=False).agg({'Name':'first', 'Cat':'first', 'T':'sum'})
    print (df)
       Code_Name     Name Cat   T
    0          1      Tom   A  13
    1          2    Nicko   B  10
    2          3    Krish   C  26
    3          4  Jack kr   D  23
    

    或者,如果某些值在每个组中重复,例如此处 Cat 值,则将此列添加到 groupby - 仅应在输出中更改顺序:

    df = df.groupby(['Code_Name','Cat'],as_index=False).agg({'Name':'first', 'T':'sum'})
    print (df)
       Code_Name Cat     Name   T
    0          1   A      Tom  13
    1          2   B    Nicko  10
    2          3   C    Krish  26
    3          4   D  Jack kr  23
    

    【讨论】:

    • 谢谢,我刚刚修改了你的代码,它对我有用!
    【解决方案3】:

    如果您不关心其他变量,则只需按感兴趣的列分组:

    gb = df.groupby(['Code_Name'],as_index=False)['T'].sum()
    print(gb)
    
       Code_Name   T
    0          1  13
    1          2  10
    2          3  26
    3          4  23
    

    现在要获取您的输出,您可以获取每个组的 Name 的最后一个值:

    gb = df.groupby(['Code_Name'],as_index=False).agg({'Name': 'last', 'Cat': 'first', 'T': 'sum'})
    print(gb)
    
    0          1     Tom   A  13
    1          2    Nick   B  10
    2          3  Krishx   C  26
    3          4   Jacks   D  23
    

    【讨论】:

    • 这不起作用,因为我会丢失我的姓名列和其他列
    • @jezrael 我同时添加了它。请注意,我使用 last 而不是 first,因为它不会导致所需的输出。
    • 是的,它是后来的,但我没有读你的就写了。无论如何,我对last 部分不好,看来first 效果更好。
    • 是的,你是对的,所以回滚。如果使用一些编辑我的名字从你的答案中消失了。
    猜你喜欢
    • 2020-10-04
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多