按行号

时间:2017-12-09 22:20:58

标签: python pandas dictionary

问题

我的字典看起来像这样:

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)

我可以写一个循环来做这个,但它相当乏味,我想知道是否有更好的方法。请指教。

4 个答案:

答案 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}}