将字典列表的字典转换为数据框
Converting a dictionary of lists of dictionaries to a dataframe
我有以下字典列表子样本(来自包含数百万项的更大字典):
bool_dict = {0: [{0: 4680}, {1: 1185}],
1: [{0: 172}, {1: 9}],
2: [{0: 149}, {1: 1282}],
3: [{0: 20}, {1: 127}],
4: [{0: 0}, {1: 0}]}
我将其转换为以下形式的数据框:
0 1
0 {0: 4680} {1: 1185}
1 {0: 172} {1: 9}
2 {0: 149} {1: 1282}
3 {0: 20} {1: 127}
4 {0: 0} {1: 0}
通过执行以下操作:
test=pd.DataFrame(bool_dict.values(),columns['0','1'],index=bool_dict.keys()).sort_index()
问题是我只需要数据框中每个单元格的值,而不是键。因此,所需的输出是:
0 1
0 4680 1185
1 172 9
2 149 1282
3 20 127
4 0 0
我尝试了以下方法:
test['0'] = test['0'].apply(lambda x: x[0])
但后来我发现一个关于我认为是字典的关键错误。
为了确定它确实是一本字典,我尝试了
from ast import literal_eval
test['0']=test['0'].apply(lambda x: literal_eval(str(x)))
然后再试一次
test['0'] = test['0'].apply(lambda x: x[0])
没有成功(我也尝试将密钥设置为“0”)。
更新:为了确保 lambda 是问题所在,这工作得很好:
test['0'].head():
0 {0: 4680}
1 {0: 247}
2 {0: 0}
3 {0: 0}
4 {0: 104}
我可以通过 :
进行拆分,然后删除无关的东西,但由于很多原因,我感觉不对。
一种方法是将内部列表转换为字典,然后将其传递给 DataFrame 构造函数:
bool_dict_flattened = {i: {k:v for d in lst for k,v in d.items()} for i, lst in bool_dict.items()}
df = pd.DataFrame.from_dict(bool_dict_flattened, orient='index')
另一种选择是在列上应用 str
访问器,方法是利用每列的列名和键匹配这一事实:
out = pd.DataFrame.from_dict(bool_dict, orient='index').apply(lambda x: x.str[x.name])
输出:
0 1
0 4680 1185
1 172 9
2 149 1282
3 20 127
4 0 0
您可以使用第一个 lambda 遍历每一行,然后使用第二个 lambda 遍历该行中的每个单元格并读取字典的值:
df = pd.DataFrame(bool_dict).T
df.apply(lambda x: x.apply(lambda y: list(y.values())[0]))
df
0 1
0 4680 1185
1 172 9
2 149 1282
3 20 127
4 0 0
我有以下字典列表子样本(来自包含数百万项的更大字典):
bool_dict = {0: [{0: 4680}, {1: 1185}],
1: [{0: 172}, {1: 9}],
2: [{0: 149}, {1: 1282}],
3: [{0: 20}, {1: 127}],
4: [{0: 0}, {1: 0}]}
我将其转换为以下形式的数据框:
0 1
0 {0: 4680} {1: 1185}
1 {0: 172} {1: 9}
2 {0: 149} {1: 1282}
3 {0: 20} {1: 127}
4 {0: 0} {1: 0}
通过执行以下操作:
test=pd.DataFrame(bool_dict.values(),columns['0','1'],index=bool_dict.keys()).sort_index()
问题是我只需要数据框中每个单元格的值,而不是键。因此,所需的输出是:
0 1
0 4680 1185
1 172 9
2 149 1282
3 20 127
4 0 0
我尝试了以下方法:
test['0'] = test['0'].apply(lambda x: x[0])
但后来我发现一个关于我认为是字典的关键错误。
为了确定它确实是一本字典,我尝试了
from ast import literal_eval
test['0']=test['0'].apply(lambda x: literal_eval(str(x)))
然后再试一次
test['0'] = test['0'].apply(lambda x: x[0])
没有成功(我也尝试将密钥设置为“0”)。
更新:为了确保 lambda 是问题所在,这工作得很好:
test['0'].head():
0 {0: 4680}
1 {0: 247}
2 {0: 0}
3 {0: 0}
4 {0: 104}
我可以通过 :
进行拆分,然后删除无关的东西,但由于很多原因,我感觉不对。
一种方法是将内部列表转换为字典,然后将其传递给 DataFrame 构造函数:
bool_dict_flattened = {i: {k:v for d in lst for k,v in d.items()} for i, lst in bool_dict.items()}
df = pd.DataFrame.from_dict(bool_dict_flattened, orient='index')
另一种选择是在列上应用 str
访问器,方法是利用每列的列名和键匹配这一事实:
out = pd.DataFrame.from_dict(bool_dict, orient='index').apply(lambda x: x.str[x.name])
输出:
0 1
0 4680 1185
1 172 9
2 149 1282
3 20 127
4 0 0
您可以使用第一个 lambda 遍历每一行,然后使用第二个 lambda 遍历该行中的每个单元格并读取字典的值:
df = pd.DataFrame(bool_dict).T
df.apply(lambda x: x.apply(lambda y: list(y.values())[0]))
df
0 1
0 4680 1185
1 172 9
2 149 1282
3 20 127
4 0 0