我有以下数据框:
df = pd.DataFrame({'scene':[{"living":"0.515","kitchen":"0.297"}, {"kitchen":"0.401","study":"0.005"}, {"study":"0.913"}, {}, {"others":"0"}], 'id':[1, 2, 3 ,4, 5]})
id scene
01 {"living":"0.515","kitchen":"0.297"}
02 {"kitchen":"0.401","study":"0.005"}
03 {"study":"0.913"}
04 {}
05 {"others":"0"}
我想创建一个新的数据框,如下所示,有人可以帮助我使用Pandas创建它吗?
id living kitchen study others
01 0.515 0.297 0 0
02 0 0.401 0.005 0
03 0 0 0.913 0
04 0 0 0 0
05 0 0 0 0
答案 0 :(得分:4)
简单的解决方案是将您的scene
列转换为词典列表,并使用默认构造函数创建新的数据框:
pd.DataFrame(df.scene.tolist()).fillna(0)
结果:
kitchen living others study
0 0.297 0.515 0 0
1 0.401 0 0 0.005
2 0 0 0 0.913
3 0 0 0 0
4 0 0 0 0
创建DataFrame的“默认”方法之一是使用词典列表。在这种情况下,列表的每个字典都将转换为单独的行,而字典的每个键都将用作列标题。
答案 1 :(得分:2)
根据您的数据
df = pd.DataFrame({'scene':[{"living":"0.515","kitchen":"0.297"}, {"kitchen":"0.401","study":"0.005"},
{"study":"0.913"}, {}, {"others":"0"}],
'id':[1, 2, 3 ,4,5], 's': ['a','b','c','d','e']})
df:
id s scene
0 1 a {'kitchen': '0.297', 'living': '0.515'}
1 2 b {'kitchen': '0.401', 'study': '0.005'}
2 3 c {'study': '0.913'}
3 4 d {}
4 5 e {'others': '0'}
您可以通过两种方式进行此操作,
在一行中,您必须在set_index
函数中输入除'scene'以外的所有列名
df = df.set_index(['id', 's'])['scene'].apply(pd.Series).fillna(0).reset_index()
它将输出:
id s kitchen living study others
0 1 a 0.297 0.515 0 0
1 2 b 0.401 0 0.005 0
2 3 c 0 0 0.913 0
3 4 d 0 0 0 0
4 5 e 0 0 0 0
在两行中,您将在其中创建例外结果,并将其连接到原始数据框。
df1 = df.scene.apply(pd.Series).fillna(0)
df = pd.concat([df, df1], axis=1)
给出,
id s scene kitchen living study others
0 1 a {'kitchen': '0.297', 'living': '0.515'} 0.297 0.515 0 0
1 2 b {'kitchen': '0.401', 'study': '0.005'} 0.401 0 0.005 0
2 3 c {'study': '0.913'} 0 0 0.913 0
3 4 d {} 0 0 0 0
4 5 e {'others': '0'} 0 0 0 0
答案 2 :(得分:0)
已更新。这一个完美。欢迎提出您的建议以使其更简洁。
import json
import pandas as pd
df = pd.DataFrame({'scene':[{"living":"0.515","kitchen":"0.297"}, {"kitchen":"0.401","study":"0.005"}, {"study":"0.913"}, {}, {"others":"0"}], 'id':[1, 2, 3 ,4,5], 's':['a','b','c','d','e']})
def test(Scene, type):
Scene = json.loads(Scene)
if type in Scene.keys():
return Scene[type]
else:
return ""
a = ['living', 'kitchen', 'study', 'others']
for b in a:
df[b] = df['Scene'].map(lambda Scene: test(Scene, b.lower()))
cols = ['living', 'kitchen', 'study', 'others']
df[cols] = df[cols].replace({'': 0})
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce', axis=1)
答案 3 :(得分:0)
一个完美的一线解决方案就在这里,感谢所有帮助:
df.join(df['scene'].apply(json.loads).apply(pd.Series))