将 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())

谢谢。

如果你能保证XZ在一个组中只出现一次,你可以使用groupbypd.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 连接起来,该行包含根据您规定的标准简化的数据帧版本。