用第三列的值替换 Dataframe 列中对应于另一个 Dataframe 列的值的子字符串

Replace substrings from a Dataframe column which correspond to values of another dataframe column with values of a third column

我有这个庞大的数据集,我必须在其中用相应的 ISO 代码替换每个国家/地区的名称。我把每个国家的ISO编码存到另一个df里了。 例如

df1:

TERRITORY
France, Italy
Italy
Spain, France
France, Spain, Italy

df2:

COUNTRY ISO CODE
France FR
Italy IT
Spain ES

预期输出:

TERRITORY
FR, IT
IT
ES, FR
FR, ES, IT

我最后的尝试是将元素转换为元组然后替换,但它不起作用(我不知道它是否有意义,但无论如何这是我的代码):

country = tuple(list(df2['COUNTRY']))
iso = tuple(list(df2['ISO CODE']))
z = zip(x, y)

for x, y in z:
  if x in df1['TERRITORY']:
    df1['TERRITORY'].str.replace(x, y)

但这并没有改变任何东西。

您可以使用 .str.split + .explode 的组合,然后 .replace + .set_index,最后 .groupby(level=0) + agg(list) + .str.join:

df1['TERRITORY'] = df1['TERRITORY'].str.split(', ').explode().replace(df2.set_index('COUNTRY')['ISO CODE']).groupby(level=0).agg(list).str.join(', ')

输出:

>>> df1
    TERRITORY
0      FR, IT
1          IT
2      ES, FR
3  FR, ES, IT

如果您拥有所有映射,您也可以只使用 replace():

df1.replace(df2.set_index('COUNTRY').squeeze(), regex=True)

输出:

    Territory
0      FR, IT
1          IT
2      ES, FR
3  FR, ES, IT