【问题标题】:extract dataframes from list of dictionaries and combine into one从字典列表中提取数据框并合并为一个
【发布时间】:2020-09-05 22:52:55
【问题描述】:

我有一个字典列表。列表中的每个项目都是一个字典。每个字典都是一对键和值,值是一个数据框。

我想提取所有数据框并将它们合并为一个。

我试过了:

df = pd.DataFrame.from_dict(data)

对于完整的数据文件和列表中的每个字典。 这给出了以下错误:

ValueError: If using all scalar values, you must pass an index

我也试过把字典变成一个列表,然后转换成一个 pd.DataFrame,我得到:

KeyError: 0

有什么想法吗?

【问题讨论】:

  • 你能举一些输入数据的例子吗?你也许可以在没有熊猫的情况下做到这一点。嵌套的 dict 列表是否都具有相同的形状?
  • 也许是pd.concat([pd.DataFrame(d) for d in data.values()], keys=data.keys)?
  • 尝试 pd.concat([pd.DataFrame(d) for d in data.values()], keys=data.keys) 给我错误如果使用标量值,则必须传递索引.

标签: python pandas dictionary


【解决方案1】:

这应该可行。

import pandas as pd

dict1 = {'d1': pd.DataFrame({'a': [1,2,3], 'b': ['one', 'two', 'three']})}
dict2 = {'d2': pd.DataFrame({'a': [4,5,6], 'b': ['four', 'five', 'six']})}
dict3 = {'d3': pd.DataFrame({'a': [7,8,9], 'b': ['seven', 'eigth', 'nine']})}

# dicts list. you would start from here
dicts_list = [dict1, dict2, dict3]

dict_counter = 0
for _dict in dicts_list:

    aux_df = list(_dict.values())[0]
    if dict_counter == 0:
        df = aux_df
    else:
        df = df.append(aux_df)

    dict_counter += 1

# Reseting and dropping old index
df = df.reset_index(drop=True)

print(df)

出于好奇:为什么您的子数据框已包含在字典中?从字典创建数据框的一种简单方法是构建一个字典列表,然后调用pd.DataFrame(list_with_dicts)。如果所有字典中的键都相同,它应该可以工作。只是我这边的一个建议。像这样的:

list_with_dicts = [{'a': 1, 'b': 2}, {'a': 5, 'b': 4}, ...]

# my_df -> DataFrame with columns [a, b] and two rows with the values in the dict.
my_df = pd.DataFrame(list_with_dicts)

【讨论】:

  • 我希望我知道,这不是我的数据。
【解决方案2】:

pd.concat() 应该是可行的。假设您有一个字典列表l

l = ( 
    {'a': pd.DataFrame(np.arange(9).reshape((3,3)))}, 
    {'b': pd.DataFrame(np.arange(9).reshape((3,3)))}, 
    {'c': pd.DataFrame(np.arange(9).reshape((3,3)))}   
)  

您可以将列表中每个字典中的数据帧提供给pd.concat()

df = pd.concat([[pd.DataFrame(df_) for df_ in dict_.values()][0] for dict_ in l])

在我的示例中,所有数据框的列数都相同,因此结果的形状为 9 x 3。如果您的数据框有不同的列,则输出格式将不正确,并且需要额外的步骤来处理。

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2021-07-21
    • 2018-05-13
    • 1970-01-01
    • 2021-01-07
    • 2021-12-28
    相关资源
    最近更新 更多