作为groupby操作的结果将行插入到原始数据帧中

时间:2017-09-27 11:35:45

标签: python pandas dataframe group-by pandas-groupby

例如,我有一个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())

感谢。

2 个答案:

答案 0 :(得分:2)

如果您可以保证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

答案 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连接起来。