不区分大小写的pandas dataframe合并

28

我正在尝试在pandas中实现不区分大小写的合并,有没有一种方法可以在合并时直接解决这个问题?我需要使用(?i)或忽略大小写的正则表达式吗?在下面的代码片段中,我正在合并一些国家,在一个文件中可能是"United States",而在另一个文件中可能是"UNITED STATES",我只想让大小写不再成为问题。谢谢!

import pandas as pd
import csv
import sys

env_path = sys.argv[1]
map_path = sys.argv[2]


df_address = pd.read_csv(env_path + "\\address.csv")
df_CountryMapping = pd.read_csv(map_path + "\CountryMapping.csv")

df_merged = df_address.merge(df_CountryMapping, left_on="Country", right_on="NAME", how="left")

....
5个回答

40
df_merged = pd.merge(df_address, df_CountryMapping, left_on=df_address["Country"].str.lower(), right_on=df_CountryMapping["NAME"].str.lower(), how="left")

10
最好在代码示例中添加一些解释是一个好的做法。 - mate00
4
很不幸,这个答案没有解释,但它是最好的答案。该方法不会修改原始数据框,它只会将合并方法的输入转换为小写。非常出色。 - autonopy
1
如何在多个列上应用 lower 方法,例如 left_on=df1['col1','col2'].str.lower() - Abu Shoeb
4
你可以使用 applymap 函数来将 df1 数据框中的两列('col1' 和 'col2')转为小写字母:df1[['col1','col2']].applymap(lambda x: str(x).lower()) - Rohan Pawar
这是正确的答案。它只在合并时将列转换为小写,并保留原始列值。 - chomprrr
当我尝试使用@RohanPawar的.applymap方法在多个列上进行连接时,我收到了一个KeyError消息,但它随后列出了列值。 - kes

37

将用于合并的两列数值转为小写,并在这两列小写数值上进行合并。

df_address['country_lower'] = df_address['Country'].str.lower()
df_CountryMapping['name_lower'] = df_CountryMapping['NAME'].str.lower()
df_merged = df_address.merge(df_CountryMapping, left_on="country_lower", right_on="name_lower", how="left")

谢谢!完全符合我的需求! - EMC

4

阅读完列名后,我建议将它们降低

df_address.columns=[c.lower() for c in df_address.columns]
df_CountryMapping.columns=[c.lower() for c in df_CountryMapping.columns]

然后更新这些值。
df_address['country']=df_address['country'].str.lower()
df_CountryMapping['name']=df_CountryMapping['name'].str.lower()

只有在这之后,才进行合并。
df_merged = df_address.merge(df_CountryMapping, left_on="country", right_on="name", how="left")

1

一种解决方案是将两个数据框的列名全部转换为小写。可以像这样进行操作:

df_address = pd.read_csv(env_path + "\\address.csv")
df_CountryMapping = pd.read_csv(map_path + "\CountryMapping.csv")

df_address.rename(columns=lambda x: x.lower(), inplace=True)
df_CountryMapping.rename(columns=lambda x: x.lower(), inplace=True)

df_merged = df_address.merge(df_CountryMapping, left_on="country", right_on="name", how="left")

1
另一种选择是使用“.str.casefold()”来更全面地融合ASCII和不同的语言字符。如果只使用英文字母,则与“.str.lower()”相同。
df_address['country_casefolded'] = df_address['Country'].str.casefold()
df_CountryMapping['name_casefolded'] = df_CountryMapping['NAME'].str.casefold()
df_merged = df_address.merge(df_CountryMapping, left_on="country_casefolded", right_on="name_casefolded", how="left")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接