Python 将groupby操作的结果行插入原始数据帧
例如,我有一个熊猫数据框,如下所示:Python 将groupby操作的结果行插入原始数据帧,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,Pandas Groupby,例如,我有一个熊猫数据框,如下所示: col_1 col_2 col_3 col_4 a X 5 1 a Y 3 2 a Z 6 4 b X 7 8 b Y 4 3 b Z 6 5 我想,对于col_1中的每个值,添加col_3和col_4中对应于col_2中X和Z的值,
col_1 col_2 col_3 col_4
a X 5 1
a Y 3 2
a Z 6 4
b X 7 8
b Y 4 3
b Z 6 5
我想,对于col_1中的每个值,添加col_3和col_4中对应于col_2中X和Z的值,并用这些值创建一个新行。因此,输出如下所示:
col_1 col_2 col_3 col_4
a X 5 1
a Y 3 2
a Z 6 4
a NEW 11 5
b X 7 8
b Y 4 3
b Z 6 5
b NEW 13 13
此外,col_1中可能有更多的值需要相同的处理,因此我无法明确引用“a”和“b”。我尝试使用groupby('col_1')和apply()的组合,但无法使其工作。我与下面的内容非常接近,但我无法让它在第2列中添加“NEW”,并在第1列中保留原始值(a或b等)
df.append(df[(df['col_2'] == 'X') | (df['col_2'] == 'Z')].groupby('col_1').mean())
谢谢。如果您可以保证
X
和Z
在一个组中只出现一次,您可以使用groupby
和pd.concat操作:
new = df[df.col_2.isin(['X', 'Z'])]\
.groupby(['col_1'], as_index=False).sum()\
.assign(col_2='NEW')
df = pd.concat([df, new]).sort_values('col_1')
df
col_1 col_2 col_3 col_4
0 a X 5 1
1 a Y 3 2
2 a Z 6 4
0 a NEW 11 5
3 b X 7 8
4 b Y 4 3
5 b Z 6 5
1 b NEW 13 13
以下代码将执行此操作:
import pandas as pd
def sum_group(df):
dfxz = df[df.col_2.isin(['X','Z'])]
sum_row = pd.Series(
[
df.col_1.iloc[0],
'NEW',
dfxz.col_3.sum(),
dfxz.col_4.sum()
], index = dfxz.columns)
return df.append(sum_row, ignore_index=True)
df = pd.DataFrame([['a', 'X', 5, 1],
['a', 'Y', 3, 2],
['a', 'Z', 6, 4],
['b', 'X', 7, 8],
['b', 'Y', 4, 3],
['b', 'Z', 6, 5]],
columns = ['col_1','col_2','col_3','col_4'])
df = df.groupby('col_1').apply(
sum_group,
).reset_index(drop=True)
print df
groupby
对象的apply
方法调用返回数据帧的函数sum\u group
。然后将这些数据帧连接成一个数据帧。sum_组
将传入的数据帧与另一行
sum_行连接起来,该行根据您所述的标准包含数据帧的简化版本。您能保证X和Z在一个组中只出现一次吗?是的,在列1中每个值总是有3行,而在列2中,X、Y和Z只出现一次。列4之后的列数不确定,但它始终是一个需要与列3和列4相同处理的列,即X和Z的总和。@COLDSPEED,效果很好。现在如何应用自定义函数而不是sum()。所以,如果我需要用X除以Z,比如说?@Saturate,我想这有点难。我想你需要一个内有lambda的agg/apply来进行除法。你能再问一个问题吗?