【问题标题】:Add summary row to Pandas向 Pandas 添加摘要行
【发布时间】:2021-01-25 21:26:32
【问题描述】:

我想总结 sum 的降雨量,但只需加上 平均 温度:

data = [{'year':2020,'area': 'new-hills', 'rainfall': 100, 'temperature': 20}, 
    {'year':2021,'area': 'new-hills', 'rainfall': 110, 'temperature': 20},
    {'year':2019,'area': 'new-hills', 'rainfall': 111, 'temperature': 19},
     {'year':2020, 'area': 'cape-town',  'rainfall': 70, 'temperature': 25}, 
      {'year':2021,'area': 'cape-town',  'rainfall': 80, 'temperature': 23},
      {'year':2019,'area': 'cape-town',  'rainfall': 75, 'temperature': 24},
    {'year':2019, 'area': 'mumbai',  'rainfall': 200,  'temperature': 37 },
     {'year':2020, 'area': 'mumbai',  'rainfall': 170,  'temperature': 39 },
    {'year':2021, 'area': 'mumbai',  'rainfall': 180,  'temperature': 38 },
   ] 

这可行,但我还需要显示平均温度,但我不知道如何添加它并将其保留在 same 汇总行中。这只是一个示例,但我需要在实际项目中使用相同的安排。

df = pd.DataFrame.from_dict(data)
container = []
for label, _df in df.groupby(['area']):
    _df.loc['summary'] = _df[['rainfall']].sum() # <-How do I add 2nd column that's not another 'sum' 
    container.append(_df)

df_summary = pd.concat(container)
df = (df_summary.fillna(''))

我需要的示例图片(我已填写绿色值以显示我需要代码执行的操作)。

谢谢。

如果你想使用我的代码作为 jupyter notebook 在 GitHub 上。 Pandas Summary Jupyter Notebook

【问题讨论】:

  • 您只是在寻找.agg吗?

标签: pandas summary


【解决方案1】:

你可以试试这个:

import pandas as pd

data = [{'year':2020,'area': 'new-hills', 'rainfall': 100, 'temperature': 20},
        {'year':2021,'area': 'new-hills', 'rainfall': 110, 'temperature': 20},
        {'year':2019,'area': 'new-hills', 'rainfall': 111, 'temperature': 19},
        {'year':2020, 'area': 'cape-town', 'rainfall': 70, 'temperature': 25},
        {'year':2021,'area': 'cape-town',  'rainfall': 80, 'temperature': 23},
        {'year':2019,'area': 'cape-town',  'rainfall': 75, 'temperature': 24},
        {'year':2019, 'area': 'mumbai',  'rainfall': 200,  'temperature': 37},
        {'year':2020, 'area': 'mumbai',  'rainfall': 170,  'temperature': 39},
        {'year':2021, 'area': 'mumbai',  'rainfall': 180,  'temperature': 38 }]

df = pd.DataFrame.from_dict(data)
container = []
for label, _df in df.groupby(['area']):
    _df.loc['summary'] = _df.agg({'rainfall': 'sum', 'temperature': 'mean'})
    container.append(_df)
df_summary = pd.concat(container)
df = (df_summary.fillna(''))

df

输出:

编辑

根据后续请求将温度平均值替换为常数,这里是修改后的代码:

import pandas as pd

data = [{'year': 2020, 'area': 'new-hills', 'rainfall': 100, 'temperature': 20},
        {'year': 2021, 'area': 'new-hills', 'rainfall': 110, 'temperature': 20},
        {'year': 2019, 'area': 'new-hills', 'rainfall': 111, 'temperature': 19},
        {'year': 2020, 'area': 'cape-town', 'rainfall': 70, 'temperature': 25},
        {'year': 2021, 'area': 'cape-town', 'rainfall': 80, 'temperature': 23},
        {'year': 2019, 'area': 'cape-town', 'rainfall': 75, 'temperature': 24},
        {'year': 2019, 'area': 'mumbai', 'rainfall': 200, 'temperature': 37},
        {'year': 2020, 'area': 'mumbai', 'rainfall': 170, 'temperature': 39},
        {'year': 2021, 'area': 'mumbai', 'rainfall': 180, 'temperature': 38}]

my_constants = [10, 20, 30]

def map_constant(x, v):
    x.mean()
    return v

df = pd.DataFrame.from_dict(data)
container = []
for i, group in enumerate(df.groupby(['area'])):
    label, _df = group
    _df.loc['summary'] = _df.agg({'rainfall': 'sum', 'temperature': (lambda x: map_constant(x, my_constants[i]))})
    container.append(_df)
df_summary = pd.concat(container)
df = (df_summary.fillna(''))

df

输出:

【讨论】:

  • 是的,这很有帮助。理想情况下,我需要在汇总行上放置一个“SUM”值和一个 Fixed 值。是否可以修改 df.loc['summary'] = _df[['rainfall']].sum() 以使 SUM 值低于 "rainfall" 并且恒定值低于 "temperature" 。 *当在摘要中合并时,我不太擅长合并/加入。连接...
  • 一个 SUM 值和一个固定值(我将从代码中的其他位置收集固定值)
  • 你能提供一个上面数据的例子吗?
  • 好的,所以在我的屏幕截图中,我在矩形中用绿色绘制了值,是否可以添加我自己的值,所以摘要行显示:降雨的总和,以及由我的代码提供的“温度”列中的一个值(而不是来自 SUM/AVERAGE/MEAN)(我将在其他地方计算实际值)
  • 摘要行现在将包含my_constantstemperature 下列出的常量。
猜你喜欢
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2013-07-29
  • 2019-10-22
相关资源
最近更新 更多