如果您有一个带有唯一索引的整洁的pandas Series对象,则可以按预期使用pd.Series.to_dict():它成为Python字典,每个索引指向其各自的值。
如果索引不唯一,这将变得很复杂。我的预期行为是具有相同索引的值将被分组到一个列表中,而字典将把索引作为键,并将列表作为值。我观察到的是一个以索引为键的字典,而只有Series中的一个值作为字典中的值。
是否有一种方法可以实现我预期的行为,将其内置到大熊猫中还是将其接近?目前,我在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']}
我想知道的是,在熊猫中是否存在更本地化的方法,或者这是否是解决问题的最佳方法。
答案 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']}