【问题标题】:Case insensitive pandas dataframe.merge不区分大小写的 pandas dataframe.merge
【发布时间】:2015-06-28 00:09:34
【问题描述】:

我正在努力寻找在 pandas 中进行不区分大小写合并的最简单方法。有没有办法在合并时做到这一点?我是否需要使用 (?i) 或带有忽略大小写的正则表达式?在下面的代码 sn-p 中,我加入了一些国家,其中一个文件中可能是“美国”,另一个文件中可能是“美国”,我只是想把这个案例排除在外。谢谢!

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")

....

【问题讨论】:

    标签: python csv pandas


    【解决方案1】:

    我建议在阅读后降低列名

    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")
    

    【讨论】:

      【解决方案2】:

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

      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")
      

      【讨论】:

        【解决方案3】:

        将用于合并的两列中的值小写,然后在小写列上合并

        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")
        

        【讨论】:

        • 谢谢!完全按照我的需要工作!
        【解决方案4】:

        另一个选项是使用“.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")
        

        【讨论】:

          【解决方案5】:
          df_merged = pd.merge(df_address, df_CountryMapping, left_on=df_address["Country"].str.lower(), right_on=df_CountryMapping["NAME"].str.lower(), how="left")
          

          【讨论】:

          • 最好在代码示例中添加一些解释。
          • 很遗憾,这没有解释,因为这是最好的答案。此方法不会修改原始数据帧,它仅将小写字母应用于合并方法的输入。做得很好。
          • 如何在多个列上应用lower 方法,如left_on=df1['col1','col2'].str.lower()
          • @AbuShoeb 您可以使用 applymap 来降低两列 df1[['col1','col2']].applymap(lambda x: str(x).lower())
          猜你喜欢
          • 2019-05-20
          • 2015-10-24
          • 2012-12-01
          • 2013-03-06
          • 2020-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多