问题
我的字典看起来像这样:
d = {
'a': [['a', 0], ['b', 1], ['a', 2]],
'b': [['d', 0], ['d', 1], ['d', 3]],
'c': [['f', 2], ['g', 3], ['h', 4]]
}
字典的格式为:column: [[value, row_number], ... ]
我想将其转换为如下所示的数据框:
a b c
0 a d None
1 b d None
2 a None f
3 None d g
4 None None h
尝试
我能想到的唯一方法就是创建一个新形式的字典:
new = {
'a': ['a', 'b', 'a', None, None],
'b': ['d', 'd', None, 'd', None],
'c': [None, None, 'f', 'g', 'h']
}
然后可以使用此字典创建数据帧,如下所示:
df = pd.DataFrame(new)
我可以写一个循环来做这个,但它相当乏味,我想知道是否有更好的方法。请指教。
答案 0 :(得分:1)
改变你的dict是要走的路,但这是另一种解决方案
df=pd.DataFrame(d)
df1=pd.concat([df[x].apply(pd.Series).set_index(1) for x in df.columns],1)
df1.columns=df.columns
df1
Out[477]:
a b c
1
0 a d NaN
1 b d NaN
2 a NaN f
3 NaN d g
4 NaN NaN h
如果你想改变你的词典
d1={k:{t[1]:t[0] for t in v} for k,v in d.items()}
d1
Out[479]:
{'a': {0: 'a', 1: 'b', 2: 'a'},
'b': {0: 'd', 1: 'd', 3: 'd'},
'c': {2: 'f', 3: 'g', 4: 'h'}}
答案 1 :(得分:0)
我不认为直接进入pandas
将提供重要的加速,因为你将使用对象。因此,最好修改pandas
之外的列表字典。执行此操作的最佳方法是将每个列表转换为字典,因为pandas
完全可以将dict
dict
转换为DataFrame
:
In [ ]: new_d = {col_name:{row_num: value for value, row_num in col_data} for col_name, col_data in d.items()}
...: pd.DataFrame(new_d)
Out[ ]:
a b c
0 a d NaN
1 b d NaN
2 a NaN f
3 NaN d g
4 NaN NaN h
答案 2 :(得分:0)
按如下方式重组字典:
d2 = {colname: {sublist[1]: sublist[0] for sublist in listoflists} \
for colname, listoflists in d.items()}
df = pd.DataFrame(d2)
df.where(pd.notnull(df), None) # replace np.nan with None
a b c
0 a d None
1 b d None
2 a None f
3 None d g
4 None None h
答案 3 :(得分:0)
经过一些重新排列后,您可以使用data = [(key,ix,val) for key, pair in d.items() for val, ix in pair]
df = pd.DataFrame(data).pivot(index=1, columns=0, values=2)
:
0 a b c
1
0 a d None
1 b d None
2 a None f
3 None d g
4 None None h
输出:
df.index.name = ""
df.columns.name = ""
注意:要删除列和索引值,请使用:
{{1}}