【问题标题】:How to create a dictionary of lists from two columns in a dataframe如何从数据框中的两列创建列表字典
【发布时间】:2015-05-11 08:11:29
【问题描述】:

我有一个这样的数据框

df = pd.DataFrame(columns = ['A', 'B'])
df.A = [1,1,1,2,2,2,2,4,4,5]
df.B = [5,2,4,3,1,5,4,1,2,2]

我目前正在使用什么

d = {}
for i in df.A:
    d[i] = []
    for v in df.A[df.A == i].index:
        d[i].append(df.B[v])

导致

{1: [5, 2, 4], 2: [3, 1, 5, 4], 4: [1, 2], 5: [2]}

但它很慢。

什么是pythonic方式?

编辑:

d = {}
for i in df.A.unique():
    d[i] = df[df.A == i].B.tolist()

似乎仍然必须有更快的方法

感谢您的帮助!

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    使用你编写的 python 中的两个列表创建一个简单的字典(有变体)

    mydict = dict(zip(list1, list2)) #assumes len(list1) ==  len(list2)
    

    其中 zip() 是一个 python 内置函数,它从每个列表中的相同位置获取一个项目并返回一个元组列表。通过使用 dict() 方法转换这些元组,您可以创建一个字典,其中 list1 提供字典键,而 list2 提供值。因此,两个列表需要具有相同的长度,因为 zip 方法将遍历提供的列表。您还可以使用 izip(),它可以在 itertools 模块中找到。 izip() 将返回一个迭代器而不是一个列表。虽然它们的使用方式相同,但取决于列表的大小,使用 izip() 的内存效率更高,因为 izip() 将一次返回一个可迭代对象,而不是将整个列表加载到内存中。话虽如此,当您使用字典时,它的所有内容都会加载到内存中,因此可以快速搜索键和值。 (对不起,切线)。

    【讨论】:

    • 解释一下你的代码是如何工作的以及它为什么回答这个问题会很有帮助。
    【解决方案2】:

    您可以使用 DataFrame 的 groupbyto_dict 方法,这将使所有繁重的工作在 pandas 中完成,而不是 Python 循环,例如:

    import pandas as pd
    ​
    df = pd.DataFrame(columns = ['A', 'B'])
    df.A = [1,1,1,2,2,2,2,4,4,5]
    df.B = [5,2,4,3,1,5,4,1,2,2]
    ​
    d = df.groupby('A')['B'].apply(list).to_dict()
    

    给你:

    {1: [5, 2, 4], 2: [3, 1, 5, 4], 4: [1, 2], 5: [2]}
    

    【讨论】:

      【解决方案3】:

      看广告:list to dictionary conversion with multiple values per key?

      from collections import defaultdict
      d = defaultdict(list)
      for i, j in zip(df.A,df.B):
          d[i].append(j)
      

      如果这样可以吗?

      编辑: 如果需要,可以将其转换为简单的 dict:

      d = dict(d)
      

      【讨论】:

        猜你喜欢
        • 2016-05-22
        • 1970-01-01
        • 1970-01-01
        • 2023-02-05
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 2021-09-08
        • 2022-09-27
        相关资源
        最近更新 更多