假设我有两个数据帧
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