将 groupby 操作的结果行插入到原始数据框中
Insert rows as a result of a groupby operation into the original dataframe
例如,我有一个 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(以及更多列)中对应于 [=] 中的 X 和 Z 的值28=] 并使用这些值创建一个新行。所以输出如下:
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(),但无法正常工作。我与下面的内容足够接近,但我无法将 'NEW' 放入 col_2 并将原始值(a 或 b 等)保留在 col_1 中。
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_group
,returns一个dataframe。然后将数据帧连接成一个数据帧。 sum_group
将传入的数据帧与附加行 sum_row
连接起来,该行包含根据您规定的标准简化的数据帧版本。
例如,我有一个 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(以及更多列)中对应于 [=] 中的 X 和 Z 的值28=] 并使用这些值创建一个新行。所以输出如下:
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(),但无法正常工作。我与下面的内容足够接近,但我无法将 'NEW' 放入 col_2 并将原始值(a 或 b 等)保留在 col_1 中。
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_group
,returns一个dataframe。然后将数据帧连接成一个数据帧。 sum_group
将传入的数据帧与附加行 sum_row
连接起来,该行包含根据您规定的标准简化的数据帧版本。