簡體   English   中英

組合數據幀的最佳方式(包含缺失數據和新數據):merge vs combine_first vs fillna

[英]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 而改變,沒有測試)並且能夠處理我介紹的多個邊緣情況:

  • 在 df2 中切換的列順序(名稱 c,名稱 b)
  • 在 df2 (val3,val2) 中切換的行順序
  • df2 中的不同數據不應替換 df1 中的數據
  • df1 和 df2 中的缺失數據

應該發生什么:

  • a: 1,nan,4,5 -> 1,2,4(不是 3),5,6
  • b: 1,nan,4,5 -> 1,3(不是 2),4,5,6
  • c: 1,nan,4,5 -> 1(not2/3,)2(not 3),4,5,6
  • d: 1,n,n,5 -> 1,n,n,5,n(not6)
  • e: ->1(不是 3),5,3,5,6
  • f: ->4,n,n,n,6

你更喜歡哪一個,或者有更好的方法來實現我想要實現的目標嗎?

嘗試:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM