在Python中合并数据框。

3

假设我有两个数据帧

df1 = pd.DataFrame({'A':[1,2], 'B':[3,4]}, index = [0,1])
df2 = pd.DataFrame({'B':[8,9], 'C':[10,11]}, index = [1,2])

我希望合并,如果df2中的位置有值,则覆盖df1中的任何值,并添加包括新行和列在内的df2中的新值。
结果应该是:
   A  B  C
0  1  3  nan
1  2  8  10
2 nan 9  11

我尝试过使用combine_first,但是这只会覆盖nan值。使用updated存在新行被创建而不是被覆盖的问题,而且merge也存在许多问题。

我尝试编写自己的函数。

def take_right(df1, df2, j, i):
    print (df1)
    print (df2)
    try:
        s1 = df1[j][i]
    except:
        s1 = np.NaN
    try:
        s2 = df2[j][i]
    except:
        s2 = np.NaN
    
    if math.isnan(s2):
        #print(s1)
        return s1
    else:
       # print(s2)
        return s2
    
def combine_df(df1, df2):
    
    rows = (set(df1.index.values.tolist()) | set(df2.index.values.tolist()))
    #print(rows)
    columns = (set(df1.columns.values.tolist()) | set(df2.columns.values.tolist()))
    #print(columns)
    df = pd.DataFrame()
    #df.columns = columns
    for i in rows:
        #df[:][i]=[]
        for j in columns:
                
                df = df.insert(int(i), j, take_right(df1,df2,j,i), allow_duplicates=False)
   # print(df)
                
    return df

这不会给一个空的DataFrame添加新列或行。

谢谢!


你确定 combine_first 不起作用,而你只是按错误的顺序执行了吗? - BeRT2me
2个回答

3
一种方法是创建一个空的输出数据框,其中包含 df1 和 df2 的列和索引的并集,并使用 df.update 方法将它们的值分配到 out_df 中。
import pandas as pd

df1 = pd.DataFrame({'A':[1,2], 'B':[3,4]}, index = [0,1])
df2 = pd.DataFrame({'B':[8,9], 'C':[10,11]}, index = [1,2])


out_df = pd.DataFrame(
    columns = df1.columns.union(df2.columns),
    index = df1.index.union(df2.index),
)
out_df.update(df1)
out_df.update(df2)
out_df

enter image description here


0
为什么 combine_first 不起作用?
df = df2.combine_first(df1)
print(df)

输出:

     A  B     C
0  1.0  3   NaN
1  2.0  8  10.0
2  NaN  9  11.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接