2017-06-23 24 views
1

我有兩個來自不同來源的CSV文件,其中包含來自美國各州的數據。我可以將這些文件與縣名的公用密鑰合併到一個數據框中,但這兩個文件使用不同的字符串格式。例如,一個文件 - 「df1」 - 具有「舊金山」,而另一個文件 - 「df2」 - 具有「舊金山縣」。我需要比較兩列,確定匹配,然後爲合併創建一個完全相同的密鑰。例如,如果df1包含「舊金山」,則需要檢查df2中的所有行,確定「舊金山縣」包含「舊金山」,然後在df2中創建一個新的關鍵列,該關鍵列只有「舊金山「。當合並鍵字符串不相同時將兩個CSV文件合併到Python數據框中

這是我試過的。

我會合並數據幀與內部聯接。這兩個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

這應該工作,

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 

我沒有格式化最終數據幀,但您現在應該明白如何完成你的任務。

相關問題