1. 程式人生 > 其它 >Python pandas merge不能根據列名合併兩個資料框(Key Error)?

Python pandas merge不能根據列名合併兩個資料框(Key Error)?

目錄

折騰

資料分析用慣了R,感覺pandas用起來就有點反人類了。今天用python的pandas處理資料時兩個資料框硬是合併不起來。

我有兩個資料框,列名是未知的,只能知道索引,以及哪兩個索引是用做主鍵合併的。(別問我為啥列名未知,因為我是開發工具)。

思路是這樣的,找到主鍵列,重新命名,再合併。

df1.columns.values[args.marker1-1]="markerID"
df1.columns.values[args.marker2-1]="markerID"
pd.merge(df1,df2,on='markerID')

但結果就是無論如何也合併不了。報錯KeyError:'markerID'

網上查了下是說不能直接用columns.values賦值,要分開。於是:

colnames_df1 = df1.columns
colnames_df1[args.marker1-1] = "markerID"
df1.columns = colnames_df1
colnames_df2 = df2.columns
colnames_df2[args.marker1-1] = "markerID"
df2.columns = colnames_df2
pd.merge(df1,df2,on='markerID')

實際上並沒有什麼區別。TypeError: Index does not support mutable operations

把資料框的列名全部print出來,看起來是正常的,為什麼就合併不了?

用很粗暴的方法:

pd.merge(df1,df2,left_index=True,right_index=True)

對於大部分資料可以,但有些資料是不行的,而且不報錯,結果是錯的,有很大風險。

解決方法

最後在網上又查了一圈,終於找到了答案。

原因:
兩個資料框的主鍵名看起來一樣,實際上可能不同,因為可能含有空格。怎麼來的?無解。

解決方法就是去除列名中可能存在的空格。

方法一:

df1.columns = df1.columns.str.strip() 
df2.columns=df2.columns.str.strip()

方法二:
在資料讀入時去掉。

pd.read_csv(file,sep='\s*,\s*') 
# delimiter includes x*whitespace before and after

對應到我的資料就是:

df1.columns = df1.columns.str.strip()
df2.columns = df2.columns.str.strip()
mrkid = df1.columns.values[args.marker-1]
df1.columns.values[args.marker-1]="markerID"
mergesnp = pd.merge(df1,df2,on='markerID')
mergesnp.columns.values[args.marker-1]=mrkid

參考:https://stackoverflow.com/questions/47608112/python-pandas-merge-cant-find-column-name