带有重复索引的pandas系列to_dict;用列表值做字典

时间:2019-05-09 17:30:13

标签: python pandas

如果您有一个带有唯一索引的整洁的pandas Series对象,则可以按预期使用pd.Series.to_dict():它成为Python字典,每个索引指向其各自的值。

如果索引不唯一,这将变得很复杂。我的预期行为是具有相同索引的值将被分组到一个列表中,而字典将把索引作为键,并将列表作为值。我观察到的是一个以索引为键的字典,而只有Seri​​es中的一个值作为字典中的值。

是否有一种方法可以实现我预期的行为,将其内置到大熊猫中还是将其接近?目前,我在for循环中手动管理与每个索引匹配的值,从而遍历唯一索引值。有一个更好的方法吗?

编辑: 这是一个示例:

my_series = pd.Series(['val_1', 'val_2', 'val_3', 'val_4', 'val_5'])
my_series.index = ['1', '1', '2', '2', '2']
my_series

产量

1    val_1
1    val_2
2    val_3
2    val_4
2    val_5
dtype: object

现在,具有1:1匹配行为的to_dict():

my_series.to_dict()
{'1': 'val_2', '2': 'val_5'}

我想看的是:

{'1': ['val_1', 'val_2'], '2': ['val_3', 'val_4', 'val_5']}

我可以做到这一点

{idx:list(my_series[idx]) for idx in set(my_series.index)}
{'2': ['val_3', 'val_4', 'val_5'], '1': ['val_1', 'val_2']}

我想知道的是,在熊猫中是否存在更本地化的方法,或者这是否是解决问题的最佳方法。

3 个答案:

答案 0 :(得分:1)

尝试以下操作:

my_series.reset_index().groupby('index')[0].apply(list).to_dict()

收益:

{'1': ['val_1', 'val_2'], '2': ['val_3', 'val_4', 'val_5']}

答案 1 :(得分:1)

重新创建您的处境...

>>> import pandas as pd
>>> df = pd.DataFrame([["a",10], ["b", 11], ["c", 12], ["a", 13]], 
                      columns=["letters", "numbers"])
>>> df.set_index("letters", inplace=True)
>>> print(df.to_dict())
{'numbers': {'a': 13, 'b': 11, 'c': 12}}

好,我们现在处于您的位置。 让我们暂时给它一个新索引,并按重复的索引分组。

>>> df.reset_index(inplace=True)
>>> groups = df.groupby(["letters"])
>>> new_df = groups.numbers.apply(list)
>>> print(new_df.to_dict())
{'a': [10, 13], 'b': [11], 'c': [12]}

这就是您要的。

答案 2 :(得分:1)

尝试一下:

my_series.groupby(level=0).agg(list).to_dict()

Out[358]: {'1': ['val_1', 'val_2'], '2': ['val_3', 'val_4', 'val_5']}