当合并密钥字符串不相同时,将两个CSV文件合并到Python数据框中

时间:2017-06-23 20:42:08

标签: python pandas

我有两个来自不同来源的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

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分: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

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