通过与Pandas中的另一个数据框匹配替换列表列的有效方法

时间:2018-03-19 12:48:12

标签: python pandas

我有一个pandas数据框,如下所示:

col11     col12
  X      ['A']
  Y      ['A', 'B', 'C']
  Z      ['C', 'A']

另一个看起来像:

 col21   col22
  'A'   'alpha'
  'B'   'beta'
  'C'   'gamma'

我希望以有效的方式替换基于col12的{​​{1}}并获得结果:

col22

2 个答案:

答案 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将键映射到值:

假设您的第一个DataFramedf1,第二个为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]