【问题标题】:Merging two CSV files into a Python data frame when the merge key string is not identical当合并键字符串不相同时将两个 CSV 文件合并到 Python 数据框中
【发布时间】:2017-11-27 12:25:57
【问题描述】:

我有两个来自不同来源的 CSV 文件,其中包含来自美国每个县的数据。我可以使用县名的公共键将文件合并到一个数据框中,但是这两个文件使用不同的字符串格式。例如,一个文件“df1”具有“旧金山”,而另一个文件“df2”具有“旧金山县”。我需要比较这两列,确定匹配项,然后为合并创建一个相同的键。例如,如果 df1 包含“旧金山”,我需要检查 df2 中的所有行,确定“旧金山县”包含“旧金山”,然后在 df2 中创建一个只有“旧金山”的新键列。”

这是我尝试过的。

我会将数据框与内部连接合并。这两个 CSV 文件的行数不同。我相信下面的操作将只返回匹配的行,这就是我想要的。

merged_df = pd.merge(left=df1, right=df2, left_on="COUNTY", right_on="COUNTY")

我在创建公用密钥时遇到问题。这是我所拥有的:

# Create an empty container to store the data
COUNTY_KEY = []

for row in df2['COUNTY']:
    if df1['COUNTY'] in df2['COUNTY']:
        COUNTY_KEY.APPEND(df1(['COUNTY']))
    else:
        COUNTY_KEY.append('0')

# Create the key by adding the new data to df2
df2['COUNTY_KEY'] = COUNTY_KEY

我认为问题在于我正在尝试比较两个对象——两个数据框中的县变量——但我需要进入对象内部并在字符串级别比较它们。

我已经阅读了很多关于合并数据帧的问题和答案,但我还没有发现有人问这个问题——当一个公共密钥存在但不完全匹配时,我们如何合并两个数据帧?

感谢您的帮助!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这应该可行,

    df = pd.DataFrame({'id':[1,2,3,4,5],'county':['San Francisco County','San Jose County','Miami','Syracuse','Buffalo']})
    
    df1 = pd.DataFrame({'id':[9,9,8,7,6],'county':['San Francisco','San Jos
    e','Miami', 'Syracuse','Buffalo']})
    
    def matched(target, val):
        target_vals = target['county'].values.tolist()
        for county in target_vals:
            if val in county:
                return county
    
    df1['county_key'] = df1['county'].apply(lambda x: matched(df, x))
    
    pd.merge(df, df1, how='inner', left_on='county',right_on='county_key')
    
               county_x       id_x       county_y  id_y            county_key
    0  San Francisco County     1  San Francisco     9  San Francisco County
    1       San Jose County     2       San Jose     9       San Jose County
    2                 Miami     3          Miami     8                 Miami
    3              Syracuse     4       Syracuse     7              Syracuse
    4               Buffalo     5        Buffalo     6               Buffalo
    

    我没有格式化最终的数据框,但你现在应该明白如何完成你的任务了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-13
      • 2022-01-10
      • 2012-08-12
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2020-09-16
      相关资源
      最近更新 更多