使用特定条件在 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_first
将NaN
替换为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 数据框中创建汇总行的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 groupby 在 Pandas 数据框中创建每行是运行列表的列吗?
我正在尝试使用 pandas 库在 python 中创建一个数据框。但是低于错误[重复]