![](/img/trans.png)
[英]combine_first with ffill for baseDf AND fillna for additionalDf
[英]Best way to combine dataframes (with missing & new data): merge vs combine_first vs fillna
我搜索了很多,但找不到關於哪種方式(merge vs combine_first vs fillna + append)是組合兩個互補數據幀的最佳/最有效/最健壯的方式的答案(但第一個中的數據不應該被覆蓋)。
import pandas as pd
test1 = {'name': ['name a','name b','name c','name d', 'name e'],
'val1': [1,1,1,1,1],
'val2': [None,None,None,None,None],
'val3': [4,4,4,None,None],
'val4': [5,5,5,5,5]}
d1=pd.DataFrame(test1)
test2 = {'name': ['name a','name c','name b','name e', 'name f'],
'val1': [1,2,3,3,4],
'val3': [3,3,None,3,None],
'val2': [2,2,3,5,None],
'val5': [6,6,6,6,6]}
d2=pd.DataFrame(test2)
d1.set_index('name', inplace=True)
d2.set_index('name', inplace=True)
# V1
d3=d1.combine_first(d2)
d3.reset_index('name', inplace=True)
# V2
adddf=d2[~d2.index.isin(d1.index)]
d4=d1.append(adddf)
d4=d4.fillna(d2)
# V3
d5 = pd.merge(left=d1, right=d2, left_on='name', right_on='name', suffixes=('','_x'), how='outer')
d5['val1'].fillna(d5['val1_x'], inplace=True)
d5['val2'].fillna(d5['val2_x'], inplace=True)
d5['val3'].fillna(d5['val3_x'], inplace=True)
d5.drop(d5.filter(regex='_x$').columns.tolist(),axis=1, inplace=True)
背景:我有一組要完成的數據點(使用來自多個源的數據,每個源用於添加新行或填充現有數據的缺失列,但不應覆蓋現有數據)。
每行有一個標識符(名稱)列,將/不應該有任何重復,如果源有沖突的數據,我想保留當前的(只要已經有數據,如果沒有填寫新的)。
根據我的研究,所有三個函數都可以很好地工作(並且對於小數據幀,沒有大的時間差異,可以隨着更大的 dfs 而改變,沒有測試)並且能夠處理我介紹的多個邊緣情況:
應該發生什么:
你更喜歡哪一個,或者有更好的方法來實現我想要實現的目標嗎?
嘗試:
x = d1.merge(d2, on="name", how="outer", suffixes=("", "_x"))
for c in d1.columns:
if c + "_x" not in x.columns:
continue
x[[c, c + "_x"]] = x[[c, c + "_x"]].transform(sorted, key=pd.isna, axis=1)
print(x[d1.columns.union(d2.columns)])
印刷:
name val1 val2 val3 val4 val5
0 name a 1.0 2.0 4.0 5.0 6.0
1 name b 1.0 3.0 4.0 5.0 6.0
2 name c 1.0 2.0 4.0 5.0 6.0
3 name d 1.0 NaN NaN 5.0 NaN
4 name e 1.0 5.0 3.0 5.0 6.0
5 name f 4.0 NaN NaN NaN 6.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.