从字典创建熊猫数据框

时间:2019-06-28 21:13:02

标签: python pandas dictionary

d = {'X':{'a':['a1'], 'b':['b1']}, 'Y':{'c':['c1','c2'],'d':['d1','d2']}}
df = pd.DataFrame({'variable':['a1','b1','c1','c2','d1','d2'], 'value':[54,67,25,16,34,24]})

我正在尝试将d('a1,'b1'等)中的值替换为df54,{ {1}}等。理想情况下,我想将它们存储在pandas数据框中,并用以下组合值添加67X

Y

到目前为止,我已经创建了列表推导来遍历字典值,但是看起来有些笨拙。

是否有更直接的方法来实现所需的输出?

1 个答案:

答案 0 :(得分:2)

简而言之:

repl_values = dict(df.to_dict(orient='split')['data']) 

_df = pd.DataFrame(d).unstack().dropna().apply(
      lambda x: pd.Series(x).replace(repl_values).tolist())

> _df.groupby(level=0).sum() 

X            [54, 67]
Y    [25, 16, 34, 24]
dtype: object

> _df.groupby(level=1).sum() 

a        [54]
b        [67]
c    [25, 16]
d    [34, 24]
dtype: object

说明

要使用大熊猫,可以先将df转换为字典以使其更易于操作:

repl_values = dict(df.to_dict(orient='split')['data'])    

> repl_values
{'a1': 54, 'b1': 67, 'c1': 25, 'c2': 16, 'd1': 34, 'd2': 24}

然后我们可以使用d来尝试制作一个数据框,只要我们可以用repl_values中的值代替这些值

> pd.DataFrame(d)
      X         Y
a  [a1]       NaN
b  [b1]       NaN
c   NaN  [c1, c2]
d   NaN  [d1, d2]

我们可以尝试将这些值分组并删除NaN

grouped = pd.DataFrame(d).unstack().dropna()

> grouped

X  a        [a1]
   b        [b1]
Y  c    [c1, c2]
   d    [d1, d2]
dtype: object

可以使用pandas.DataFrame.replace替换grouped中的值。这里的技巧是,由于每个单元格都包含一个列表,因此我们可以通过将replace预先转换为pd.Series来应用于每个单元格:

> grouped.apply(lambda x: pd.Series(x).replace(repl_values))  

        0     1
X a  54.0   NaN
  b  67.0   NaN
Y c  25.0  16.0
  d  34.0  24.0

要在列表中包含值,我们可以使用pd.Series.tolist()

_df = grouped.apply(lambda x: pd.Series(x).replace(repl_values).tolist()) 
> _df

X  a        [54]
   b        [67]
Y  c    [25, 16]
   d    [34, 24]
dtype: object

在最后一个数据框中,我们拥有了所需的所有信息。要获得分组的值,我们只需要做:

_df.groupby(level=0).sum() 

X            [54, 67]
Y    [25, 16, 34, 24]
dtype: object

或:

_df.groupby(level=1).sum() 

a        [54]
b        [67]
c    [25, 16]
d    [34, 24]
dtype: object