Pandas的groupby函数与dict.update()的用法

3

我正在尝试使用Pandas的groupby函数,将dict.update()函数应用于每个元素。以下是一个数据框的示例(仅作说明):

        A                                            B
0   icon1   {'ap1': {'item' : 1}, 'ap2': {'item' : 2}}

1   icon1                        {'ap3': {'item' : 3}}

我尝试的是设置类似以下的内容:
df = df.groupby('A')['B'].apply(', '.join).reset_index()

但是我需要按‘A'列分组并更新‘B’列中的每个元素,而不是使用python','.join。我尝试过使用map函数,但是并没有实现有用的结果。

结果应该是:

        A                                                                 B
0   icon1   {'ap1': {'item' : 1}, 'ap2': {'item' : 2}, 'ap3': {'item' : 3}}

如果不改变字典的项目类型,这是否可能?

3个回答

5

使用字典推导式

df.groupby('A').B.agg(lambda s: {k:v for a in s for k, v in a.items()}).reset_index()

        A                                                                 B
0   icon1   {'ap1': {'item' : 1}, 'ap2': {'item' : 2}, 'ap3': {'item' : 3}}

1
感谢 @rafaelc,经过对我的数据进行一些处理,问题得到了解决。学到了新东西:字典推导式! - Gabriel Hisatugu

3

toolz.dicttoolz.merge

from toolz.dicttoolz import merge

df.groupby('A')['B'].agg(merge).reset_index()

       A                                                  B
0  icon1  {'ap1': {'item': 1}, 'ap2': {'item': 2}, 'ap3'...
1  icon2  {'ap1': {'item': 1}, 'ap2': {'item': 2}, 'ap3'...

安装设置
df = pd.DataFrame(dict(
    A=['icon1', 'icon1', 'icon2', 'icon2'],
    B=[{'ap1': {'item': 1}, 'ap2': {'item': 2}}, {'ap3': {'item': 3}}] * 2
))

这个函数可以工作,但它返回一个对象。是否可能将此对象转换为pd.Series或Data Frame? - Gabriel Hisatugu
你需要更详细地描述你的期望。尽管如此,我会根据我理解的内容进行更新。 - piRSquared
@GabrielHisatugu 首先,pd.Seriespd.DataFrame在Python中一切皆为对象。无论如何,这将生成一个数据框,那么您到底是什么意思? - juanpa.arrivillaga
1
嘿!@juanpa.arrivillaga。OP,我不会猜测你想要什么。你可以看到我已经做了什么。如果这有意义或帮助你巩固你想做的事情,那么请编辑你的问题并提供更多描述,让我知道。 - piRSquared
抱歉,我以为期望的结果是一个好的例子。我希望结果能够显示在一个新的DataFrame中,就像groupby函数通常工作一样,其中'A'列具有'icon1'和更新后的字典在'B'列中。 - Gabriel Hisatugu

0
你可以使用一个辅助函数:
def func(x):
    dct = {}
    for i in x:
        dct.update(i)
    return dct

df.groupby('A')['B'].agg(func).reset_index()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接