用第三列的值替换 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
我有这个庞大的数据集,我必须在其中用相应的 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