【问题标题】:Generate dictionary from a pandas dataframe with multiple columns combined as the keys, remaining columns as values?从熊猫数据框中生成字典,将多列组合为键,其余列作为值?
【发布时间】:2019-09-30 14:54:25
【问题描述】:

我正在尝试从 pandas 数据框生成字典。具体来说,我需要:

  1. 取前 (x) 列,并将每行中的数据点一起用作键。

  2. 为每个键编译一个字典,使用行中剩余的数据点作为值,作为一个列表。

为了简单起见,让我们使用这个示例数据框。

  1. 生成数据框:
df = pd.DataFrame([
    {'c1':a1, 'c2':110, 'c3':'xyz', 'c4':24}, 
    {'c1':b2,'c2':100, 'c3':'jdf', 'c4':15}, 
    {'c1':a1,'c2':110, 'c3':'kjl', 'c4':125},
    {'c1':b2, 'c2':100, 'c3':'abc', 'c4':71},
])

    c1  c2  c3  c4
0   a1  110 xyz 24
1   b2  100 jdf 15
2   a1  110 kjl 125
3   b2  100 abc 71

  1. 产生以下内容:
new_dict = some code

new_dict

{('a1', 110): [['xyz', 24], ['kjl', 125]], ('b2', 100): [['jdf', 15], ['abc', 71]]}

我已经尝试了很多很多事情,包括为键创建一个元组列表,将唯一列表作为键分配给新字典(值为空列表)——但我无法填充这些值。

我能够编译一个以单列作为键的字典,并根据需要编译其他所有内容,如下所示:

test_dict = {}
for index, row in df.iterrows():
    if row['c1'] in test_dict:
        test_dict[row['c1']].append([row['c2'], row['c3'], row['c4']])
    else:
        test_dict[row['c1']] = []
        test_dict[row['c1']].append([row['c2'], row['c3'], row['c4']])

但我无法将多列组合为键。

【问题讨论】:

  • 感谢@Accumulation 指出我的样本数据中的差异。我已经编辑了这个例子。您的解决方案完美运行。非常感谢!

标签: python pandas list dictionary


【解决方案1】:

假设如下DataFrame:

import pandas as pd

df = pd.DataFrame([
    {'c1': 'a1', 'c2': 110, 'c3': 'xyz', 'c4': 24},
    {'c1': 'b2', 'c2': 100, 'c3': 'jdf', 'c4': 15},
    {'c1': 'a1', 'c2': 110, 'c3': 'kjl', 'c4': 125},
    {'c1': 'b2', 'c2': 100, 'c3': 'abc', 'c4': 71},
])

你可以groupby,聚合然后转换成字典(to_dict):

groups = df.groupby(['c1', 'c2']).apply(lambda x: x[['c3', 'c4']].values.tolist()).to_dict()
print(groups)

输出

{('a1', 110): [['xyz', 24], ['kjl', 125]], ('b2', 100): [['jdf', 15], ['abc', 71]]}

【讨论】:

  • 感谢您的帮助。您的解决方案并没有完全返回我正在寻找的东西。键是正确的,但值不是我指定的。不过,这很有见地。
  • @WartimeHotTot 更新了答案!
【解决方案2】:
test_dict = {}
for index, row in df.iterrows():
    if (row['c1'], row['c2']) in test_dict:
        test_dict[(row['c1'], row['c2'])].append([row['c3'], row['c4']])
    else:
        test_dict[(row['c1'], row['c2'])] = [[row['c3'], row['c4']]]

test_dict

{('a1', 100): [['xyz', 24], ['kjl', 125]], ('b2', 110): [['jdf', 15], ['abc', 71]]}

【讨论】:

    【解决方案3】:

    你可以试试这个groupby:

    (df.groupby(['c1','c2'])
       .apply(lambda x: x[['c3','c4']].values)
       .to_dict()
    )
    

    输出:

    {('a1', 110): array([['xyz', 24],
            ['kjl', 125]], dtype=object), ('b2', 100): array([['jdf', 15],
            ['abc', 71]], dtype=object)}
    

    【讨论】:

      【解决方案4】:

      您用于创建数据框的数据与您作为示例提供的数据框不匹配,但您似乎想要的可以通过以下方式完成:

      x = 2
      key_cols =  list(df.columns[:x])
      value_cols = df.columns[x:]
      new_dict = df.groupby(key_cols).apply(lambda sub_df: sub_df[value_cols].values.tolist()).to_dict()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-14
        • 2021-11-19
        • 2021-03-06
        相关资源
        最近更新 更多