【问题标题】:Python Pandas grouping columnsPython Pandas 分组列
【发布时间】:2018-10-05 20:53:36
【问题描述】:

这是一个 Pandas 问题 - 今天我的大脑太累了,无法解决这个问题。 有人可以帮我吗? 我有一个包含许多列的数据框,其中一列作为一个类别:

Category B C D .... Z 
1        2 11 1.0 'HOME' ....
1        3 21 1.0 'HOME' ....
1        1 33 .9 'GOPHER' ....
2        4 34 0.6  'HUMM'  ...
2        1 72 1.4  'VEEE'   ...
3        5 23  2.3  'ETC '  ....
4        3 99  3.141 'PI'  ...
4        4 1  2.634 'PI'   ...

并且想得到这个(文本列真的无关紧要)

Category B C D .... Z 
1        6 11 2.9 'HOME' ....
2        5 34 2.6  'HUMM'  ...
3        5 23  2.3  'ETC '  ....
4        7 100  5.775 'PI'  ...

如何在 Python Pandas 中执行此操作? 我使用 group() 吗?

如果 df 是我的 DataFrame,并且 newdf 中的结果将是结果数据框,那么 ndf['B'] 中会有一行 newdf['A'] = 1 和 newdf['B'] df['A'] 为 1 的所有行的 df['B'] 中的值的总和。
对于下一个类别,ndf['B'] 中将有一行 newdf['A'] = 2 并且 newdf['B'] 将是 df['B'] 中所有行的值的总和,其中 df ['A'] 是 2

等等。

我正在尝试根据 A 列中的类别汇总列的总和。对于 A 中的每个类别,我想对具有相同类别的其余列求和。

我希望我已经正确解释了。手动,这将类似于

ndf['B'] = df[ df['A'] == 1 ].sum() 
ndf['C'] = df[ df['A'] == 1 ].sum() 

基本上,我可以使用这样的东西吗:

for col in df.columns:
    if col.type(??) is number: 
        ndf[col] = df[ df[col] == 1 ].sum() 

对于 A 中的每个类别;重复

ndf['B'] = df[ df['A'] == 2 ].sum() 
ndf['C'] = df[ df['A'] == 3 ].sum() 

然后我必须为 A 的类别中的每个值循环。

这是解决问题的正确方法吗?

【问题讨论】:

  • 所以你想要 B 和 D 在每组中求和,但 C 你只想要每组的第一个值?您能在这里更明确地说明您的要求吗?
  • 您的问题不清楚,请重新构图并举例说明。
  • 我想通过总结所有有数字的列来按类别分组。我可以放心地忽略没有数字或为空的列。

标签: python pandas dataframe pandas-groupby


【解决方案1】:

您可以使用GroupBy + agg 为每个系列指定不同的功能。我已将CZ 系列链接到'first',即从每个组中提取第一个值,因为这与您想要的输出一致。

agg_rules = {'B': 'sum', 'C': 'first', 'D': 'sum', 'Z': 'first'}
res = df.groupby('Category').agg(agg_rules).reset_index()

print(res)

   Category  B   C      D       Z
0         1  6  11  2.900  'HOME'
1         2  5  34  2.000  'HUMM'
2         3  5  23  2.300   'ETC'
3         4  7  99  5.775    'PI'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2021-11-07
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多