【问题标题】:How can I calculate group sums in Python using Pandas [duplicate]如何使用 Pandas 在 Python 中计算组总和 [重复]
【发布时间】:2020-11-17 09:12:56
【问题描述】:

我有一个使用 pandas 组功能的数据框:

pandas dataframe

group. letters.  counts.   sum_1.    sum_2
1.     a.        20        3.        2
1.     b.        40.       2.        3
2.     a.        60.       3.        5
2.     b.        90.       5.        4

我想将它自动化,而不必在 Excel 中进行这样的操作: excel

group. letters.  counts.   sum_1.        sum_1_%.   sum_2.   sum_2rate
    1.     a.        20        3.        5%          2       3.33%
    1.     b.        40.       2.        3.33%       3       5%
    total.           60        5                     5
    2.     a.        60.       3.                    5
    2.     b.        90.       5.                    4

【问题讨论】:

  • 不,我正在尝试查找每个组中的总计数和 sum_1 除以总数。
  • 和 sum_2 一样,不知道有没有办法在 Pandas 中做到这一点而无需进入 excel。我有大约 200 个组。
  • 你想达到什么目的?你如何得到 sum1% ?您可以使用 groupby('group') 获取 df 并将其附加,然后排序...但我建议在仅用于报告的临时 df 上执行此操作,以便保持数据完整

标签: python excel pandas


【解决方案1】:

是的,使用 Trenton 链接,加上其他一些你可以实现你想要的东西。你可能只是懒得做更多的研究。

d = [{'group': 1, 'letters': 'a', 'counts': 20, 'sum1': 3, 'sum2': 2},
    {'group': 1, 'letters': 'b', 'counts': 40, 'sum1': 2, 'sum2': 3},
    {'group': 2, 'letters': 'a', 'counts': 60, 'sum1': 3, 'sum2': 5},
    {'group': 2, 'letters': 'b', 'counts': 90, 'sum1': 5, 'sum2': 4}
]
df = pd.DataFrame(d, columns=['group', 'letters', 'counts', 'sum1', 'sum2']) # this is your original df
#print(df)

df2 = df.groupby(by="group").sum() # this will give the summary you want
#print(df2)

df3 = pd.merge(df, df2, how='inner', on='group') # merge 2 of them
print(df3)

df3['avg_counts'] = df3['counts_x'] / df3['counts_y'] # add new calculated columns 
df3['avg_sum1'] = df3['sum1_x'] / df3['sum1_y']
df3['avg_sum2'] = df3['sum2_x'] / df3['sum2_y']
print(df3.head())

#if needed remove the columns you dont need

结果

   group letters  counts_x  sum1_x  sum2_x  counts_y  sum1_y  sum2_y  avg_counts  avg_sum1  avg_sum2
0      1       a        20       3       2        60       5       5   0.333333      0.600  0.400000
1      1       b        40       2       3        60       5       5   0.666667      0.400  0.600000
2      2       a        60       3       5       150       8       9   0.400000      0.375  0.555556
3      2       b        90       5       4       150       8       9   0.600000      0.625  0.444444

【讨论】:

  • +10 for 你可能只是懒得做更多的研究。
  • 谢谢+10 :) 顺便说一句,特伦顿,当我想打印时(df3)-> 有很多列,打印结果有点缩短(不显示所有列)。如何显示完整的列? *我还是 python 新手..
  • group letters counts_x sum1_x ... sum2_y avg_counts avg_sum1 avg_sum2 它表明...如果有太多列打印出来
  • pd.set_option('display.max_columns', 700) & pd.set_option('display.max_rows', 400) & pd.set_option('display.min_rows', 10) & pd.set_option('display.expand_frame_repr', True)
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多