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
'等)中的值替换为df
(54
,{ {1}}等。理想情况下,我想将它们存储在pandas数据框中,并用以下组合值添加67
和X
:
Y
到目前为止,我已经创建了列表推导来遍历字典值,但是看起来有些笨拙。
是否有更直接的方法来实现所需的输出?
答案 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