我有两个来自不同来源的CSV文件,其中包含来自美国每个县的数据。我可以将文件合并到具有县名通用键的单个数据框中,但是两个文件使用不同的字符串格式。例如,一个文件“ df1”具有“ San Francisco”,而另一个文件“ df2”具有“ San Francisco County”。我需要比较两列,确定匹配项,然后为合并创建相同的键。例如,如果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
我相信问题在于我正在尝试比较两个对象-两个数据框中的县变量-但我需要进入对象内部并在字符串级别进行比较。
我已经阅读了很多有关合并数据帧的问题和答案,但是我还没有发现有人问这个问题-当存在一个公共密钥但不完全匹配时,如何合并两个数据帧?
谢谢您的帮助!
最佳答案
这应该工作,
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
我没有格式化最终数据框,但您现在应该了解如何完成任务。