我有一个pandas数据框,如下所示:
col11 col12
X ['A']
Y ['A', 'B', 'C']
Z ['C', 'A']
另一个看起来像:
col21 col22
'A' 'alpha'
'B' 'beta'
'C' 'gamma'
我希望以有效的方式替换基于col12
的{{1}}并获得结果:
col22
答案 0 :(得分:3)
一种解决方案是使用索引系列作为具有列表推导的映射器:
import pandas as pd
df1 = pd.DataFrame({'col1': ['X', 'Y', 'Z'],
'col2': [['A'], ['A', 'B', 'C'], ['C', 'A']]})
df2 = pd.DataFrame({'col21': ['A', 'B', 'C'],
'col22': ['alpha', 'beta', 'gamma']})
s = df2.set_index('col21')['col22']
df1['col2'] = [list(map(s.get, i)) for i in df1['col2']]
结果:
col1 col2
0 X [alpha]
1 Y [alpha, beta, gamma]
2 Z [gamma, alpha]
答案 1 :(得分:1)
我不确定它是最有效的方式,但您可以将DataFrame
变为dict
,然后使用apply
将键映射到值:
假设您的第一个DataFrame
为df1
,第二个为df2
:
df_dict = dict(zip(df2['col21'], df2['col22']))
df3 = pd.DataFrame({"31":df1['col11'], "32": df1['col12'].apply(lambda x: [df_dict[y] for y in x])})
或@jezrael建议使用嵌套列表理解:
df3 = pd.DataFrame({"31":df1['col11'], "32": [[df_dict[y] for y in x] for x in df1['col12']]})
注意:df3
有一个默认索引</ p>
31 32
0 X [alpha]
1 Y [alpha, beta, gamma]
2 Z [gamma, alpha]