例如,我有一个pandas数据帧如下:
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()的组合,但我无法让它工作。我跟下面的距离很近,但我不能让它在col_2中加上'NEW'并保持col_1中的原始值(a或b等)。
df.append(df[(df['col_2'] == 'X') | (df['col_2'] == 'Z')].groupby('col_1').mean())
感谢。
答案 0 :(得分:2)
如果您可以保证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
答案 1 :(得分:0)
以下代码执行此操作:
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
apply
对象的groupby
方法调用返回数据帧的函数sum_group
。然后将数据帧连接成单个数据帧。 sum_group
将传入的数据帧与包含数据帧缩小版本的其他行sum_row
连接起来。