使用特定条件在 pandas 数据框中创建汇总行

Posted

技术标签:

【中文标题】使用特定条件在 pandas 数据框中创建汇总行【英文标题】:Creating summed summary rows in pandas dataframe with specific criteria 【发布时间】:2017-06-15 23:58:17 【问题描述】:

假设我有以下 pandas 数据框,我正在尝试发布处理结果以生成我的(现在为空白)摘要行:

    code    entry_type  value1  value2  value3  value4
1   A       Holding     1.1     1.2     1.3     1.4
2   A       Holding     2.1     2.2     2.3     2.4
3   B       Holding     3.1     3.2     3.3     3.4
4   C       Holding     4.1     4.2     4.3     4.4
5   C       Holding     5.1     5.2     5.3     5.4
6   A       Summary     nan     nan     nan     nan
7   C       Summary     nan     nan     nan     nan
8   B       Summary     nan     nan     nan     nan

基本上,我希望摘要行中的 value1-value4 是每个代码中的总和:

    code    entry_type  value1  value2  value3  value4
1   A       Holding     1.1     1.2     1.3     1.4
2   A       Holding     2.1     2.2     2.3     2.4
3   B       Holding     3.1     3.2     3.3     3.4
4   C       Holding     4.1     4.2     4.3     4.4
5   C       Holding     5.1     5.2     5.3     5.4
6   A       Summary     3.2     3.4     3.6     3.8
7   C       Summary     9.2     9.4     9.6     9.8
8   B       Summary     3.1     3.2     3.3     3.4

我尝试了几行分组代码,并得出以下结论:

set = df[df['entry_type']=="Holding"].groupby('code')[['value1', 'value2', 'value3', 'value4']].sum()

产量:

        value1  value2  value3  value4
code
    A   3.2     3.4     3.6     3.8
    B   3.1     3.2     3.3     3.4
    C   9.2     9.4     9.6     9.8

但是我不确定如何将它应用回原始 DataFrame,特别是因为代码顺序不一定与原始 DataFrame 相同。关于如何应用它的任何想法?还是更好的方法? (注意 - 其他列的摘要行中已经存在一堆额外的数据,所以我不能只内联生成新行)。

【问题讨论】:

【参考方案1】:

看来concat 有帮助:

df1  = df[df['entry_type']=="Holding"]
         .groupby('code')[['value1', 'value2', 'value3', 'value4']].sum()
#print (df1)

#if need filter `df` for only rows with Holding use boolean indexing
print (pd.concat([df[df['entry_type']=="Holding"].set_index('code'), df1])
         .fillna('entry_type':'Summary')
         .reset_index())

  code entry_type  value1  value2  value3  value4
0    A    Holding     1.1     1.2     1.3     1.4
1    A    Holding     2.1     2.2     2.3     2.4
2    B    Holding     3.1     3.2     3.3     3.4
3    C    Holding     4.1     4.2     4.3     4.4
4    C    Holding     5.1     5.2     5.3     5.4
5    A    Summary     3.2     3.4     3.6     3.8
6    B    Summary     3.1     3.2     3.3     3.4
7    C    Summary     9.2     9.4     9.6     9.8

另一种可能的解决方案是使用combine_firstNaN 替换为df1,并将index 的值对齐df

print (df.set_index('code')
         .combine_first(df1)
         .sort_values(['entry_type'])
         .reset_index())

  code entry_type  value1  value2  value3  value4
0    A    Holding     1.1     1.2     1.3     1.4
1    A    Holding     2.1     2.2     2.3     2.4
2    B    Holding     3.1     3.2     3.3     3.4
3    C    Holding     4.1     4.2     4.3     4.4
4    C    Holding     5.1     5.2     5.3     5.4
5    A    Summary     3.2     3.4     3.6     3.8
6    B    Summary     3.1     3.2     3.3     3.4
7    C    Summary     9.2     9.4     9.6     9.8

【讨论】:

以上是关于使用特定条件在 pandas 数据框中创建汇总行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:在数据框中创建一个新列,该列是滚动窗口的函数

我可以使用 groupby 在 Pandas 数据框中创建每行是运行列表的列吗?

如何为 pandas 数据框中的不同组分配唯一 ID?

我正在尝试使用 pandas 库在 python 中创建一个数据框。但是低于错误[重复]

从具有大量标签的 Pandas 数据框中创建 TensorFlow 数据集?

根据其他列值/ Pandas -Python 在数据框中创建 ID 列