Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将groupby操作的结果行插入原始数据帧_Python_Pandas_Dataframe_Group By_Pandas Groupby - Fatal编程技术网

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来进行除法。你能再问一个问题吗?