Python 通过输入键连接多个分组数据帧

Python 通过输入键连接多个分组数据帧,python,pandas,Python,Pandas,我一个接一个地做了我想做的手术。他们给了我想要的结果。因此,为了完成这项工作,我想用我用来分组数据帧的同一个键来连接这些分组数据帧。现在我得到了一个“***KeyError:'key'”,因为分组的数据帧没有允许我执行合并操作的“key”列。 我在熊猫身上迈出了第一步。是否有一种方法可以将键列保留在groupby中,以便我可以执行合并,或者有一种更简单的方法可以实现所需输出中显示的相同结果 import pandas as pd raw_data = { 'key': ['a', 'a

我一个接一个地做了我想做的手术。他们给了我想要的结果。因此,为了完成这项工作,我想用我用来分组数据帧的同一个键来连接这些分组数据帧。现在我得到了一个“***KeyError:'key'”,因为分组的数据帧没有允许我执行合并操作的“key”列。 我在熊猫身上迈出了第一步。是否有一种方法可以将键列保留在groupby中,以便我可以执行合并,或者有一种更简单的方法可以实现所需输出中显示的相同结果

import pandas as pd

raw_data = {
    'key': ['a', 'a', 'b', 'c', 'c', 'c', 'd', 'a', 'b', 'c'],
    'type_op': ['OP1', 'OP2', 'OP3', 'OP2', 'OP1', 'OP3', 'OP2', None, 'OP1', 'OP3'],
    'type_xp': ['XP2', 'XP2', None, 'XP3', 'XP1', None, 'XP1', 'XP3', None, 'XP3'],
}

df = pd.DataFrame.from_dict(raw_data)

total_op1 = df[df['type_op']=='OP1'][['type_op', 'key']].groupby('key').agg(['count'])
total_op2 = df[df['type_op']=='OP2'][['type_op', 'key']].groupby('key').agg(['count'])
total_op3 = df[df['type_op']=='OP3'][['type_op', 'key']].groupby('key').agg(['count'])
total_opn = df[df['type_op'].isnull()][['type_op', 'key']].groupby('key').agg(['count'])

total_xp1 = df[df['type_xp']=='XP1'][['type_xp', 'key']].groupby('key').agg(['count'])
total_xp2 = df[df['type_xp']=='XP2'][['type_xp', 'key']].groupby('key').agg(['count'])
total_xp3 = df[df['type_xp']=='XP3'][['type_xp', 'key']].groupby('key').agg(['count'])
total_xpn = df[df['type_xp'].isnull()][['type_xp', 'key']].groupby('key').agg(['count'])

dn = df.drop_duplicates(subset='key')['key']

pd.merge(dn, total_op1, on='key', how='outer')
# ...

# the output I want...

# key   TOP1    TOP2    TOP3    TOPN    TXP1    TXP2    TXP3    TXPN    TOTAL
# a     1       1       NaN     1       NaN     2       1       NaN     6
# b     1       1       1       NaN     1       NaN     NaN     2       6
# c     1       NaN     2       NaN     1       NaN     2       1       7
# d     NaN     1       NaN     NaN     NaN     NaN     NaN     NaN     1

您可以将param
作为_index=False
传递给,看起来您还可以通过连接两个轴而不是8个groupby来实现所需的结果。可能会省下一点工作。