转换Pandas列以获取列发布组中的键值对,方法是

wljmcqd8  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(84)

我的数据框:

Col X    Col Y    ID     Value
 A         a      'r'      3
 A         a      'b'      2
 A         a      'c'      1
 B         b      'd'      5
 B         b      's'      6
 B         b      'd'      7

所需输出:

Col X    Col Y    Out
 A         a      {'r':3, 'b':2, 'c':1}
 B         b      {'d': 5, 's': 6, 'd':7}

迄今为止尝试的方法:

df = df.set_index(['Col X', 'Col Y', 'ID']).Value
dict_column = {k: df.xs((k, v)).to_dict() for k,v,v2 in df.index}
dsekswqp

dsekswqp1#

GroupBy.apply与lambda函数一起使用:

df['ID'] = df['ID'].str.strip("'")

df1 = (df.groupby(['Col X', 'Col Y'])[['ID','Value']]
        .apply(lambda x: dict(x.to_numpy()))
        .reset_index(name='Out'))
print (df1)
  Col X Col Y                       Out
0     A     a  {'r': 3, 'b': 2, 'c': 1}
1     B     b          {'d': 7, 's': 6}

python字典中不存在重复的键。您可以聚合值,例如,按sum

df['ID'] = df['ID'].str.strip("'")

df = df.groupby(['Col X', 'Col Y','ID'], as_index=False)['Value'].sum()
print (df)
  Col X Col Y ID  Value
0     A     a  b      2
1     A     a  c      1
2     A     a  r      3
3     B     b  d     12
4     B     b  s      6

df1 = (df.groupby(['Col X', 'Col Y'])[['ID','Value']]
        .apply(lambda x: dict(x.to_numpy()))
        .reset_index(name='Out'))
print (df1)
  Col X Col Y                       Out
0     A     a  {'b': 2, 'c': 1, 'r': 3}
1     B     b         {'d': 12, 's': 6}
t3irkdon

t3irkdon2#

您可以在apply内创建pd.Series并使用to_dict

output = ( df.groupby(['Col X', 'Col Y'])[['ID', 'Value']].
             apply(lambda x: pd.Series(x['Value'].values,index=x['ID']).to_dict()) )
k5ifujac

k5ifujac3#

可以将groupby.applydictzip一起使用:

(df.groupby(['Col X', 'Col Y'])
   .apply(lambda x: dict(zip(x['ID'], x['Value'])))
   .reset_index(name='Out')
 )

输出量:

Col X Col Y                       Out
0     A     a  {'r': 3, 'b': 2, 'c': 1}
1     B     b          {'d': 7, 's': 6}

如果要聚合重复的键:

(df.groupby(['Col X', 'Col Y'])
   .apply(lambda x: x['Value'].groupby(x['ID']).sum().to_dict())
   .reset_index(name='Out')
 )

输出量:

Col X Col Y                       Out
0     A     a  {'b': 2, 'c': 1, 'r': 3}
1     B     b         {'d': 12, 's': 6}

相关问题