【问题标题】:pandas series to_dict with repeated indices; make dict with list values具有重复索引的熊猫系列 to_dict;用列表值制作字典
【发布时间】:2019-05-09 17:30:13
【问题描述】:

如果您有一个带有唯一索引的简洁 pandas Series 对象,那么使用 pd.Series.to_dict() 可以如您所愿:它变成一个 Python dict,每个索引都指向其各自的值。

如果您有非唯一索引,这会变得复杂。我的预期行为是具有相同索引的值将组合到一个列表中,并且 dict 会将索引作为键,将列表作为值。相反,我观察到的是一个以索引为键的字典,而 Series 中只有一个值作为字典中的值。

有没有办法实现我的预期行为,内置于 pandas 或接近它?目前,我在 for 循环中手动将与每个索引匹配的值整理到 dict 中,循环遍历唯一索引值。有一个更好的方法吗?

编辑: 这是一个例子:

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

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

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']}

我想知道的是,在 pandas 中是否有更本地的方法来执行此操作,或者这是否是解决问题的最佳方法。

【问题讨论】:

  • 您能提供一个数据样本吗?那我很乐意提供解决方案
  • 我已编辑以包含一个示例。

标签: python pandas


【解决方案1】:

试试这个:

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

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

【讨论】:

    【解决方案2】:

    尝试以下方法:

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

    产量:

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

    【讨论】:

    • 我不知道这适用于哪个版本的 pandas,但在 0.24.1 中,如果不明确创建名为 index 的列,则无法调用 .groupby('index')
    • reset_index() 应该在默认情况下创建一个名为 index 的列,无论如何在 pandas 0.24.2 中
    【解决方案3】:

    重现你的情况...

    >>> 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]}
    

    这是你要求的。

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 2019-03-01
      • 2016-04-19
      • 2021-01-04
      • 2020-05-01
      • 2016-09-22
      相关资源
      最近更新 更多