![](/img/trans.png)
[英]transpose dictionary (extract all the values for one key from a list of dictionaries)
[英]extract dataframes from list of dictionaries and combine into one
我有一个字典列表。 列表中的每个项目都是一个字典。 每个字典都是一对键和值,值是一个数据框。
我想提取所有数据框并将它们组合成一个。
我努力了:
df = pd.DataFrame.from_dict(data)
对于完整的数据文件和列表中的每个字典。 这给出了以下错误:
ValueError: If using all scalar values, you must pass an index
我也尝试将字典变成列表,然后转换为 pd.DataFrame,我得到:
KeyError: 0
有任何想法吗?
使用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)))}
)
您可以将列表中每个 dict 的数据帧提供给pd.concat()
:
df = pd.concat([[pd.DataFrame(df_) for df_ in dict_.values()][0] for dict_ in l])
在我的示例中,所有数据框的列数都相同,因此结果的形状为 9 x 3。 如果您的数据框有不同的列,则 output 将是格式错误的,并且需要额外的步骤来处理。
这应该有效。
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)
只是出于好奇:为什么您的子数据框已包含在字典中? 从字典创建 dataframe 的一种简单方法是构建字典列表,然后调用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.