假设我有两个 DataFrame
df1 = pd.DataFrame({'A':[1,2], 'B':[3,4]}, index = [0,1])
df2 = pd.DataFrame({'B':[8,9], 'C':[10,11]}, index = [1,2])
我想合并,以便 df1
中的任何值在 df2
中有一个值被覆盖在该位置和 df2
中的任何新值添加了新的行和列。
结果应该是:
A B C
0 1 3 nan
1 2 8 10
2 nan 9 11
我试过了 combine_first
但这只会导致 nan 值被覆盖
updated 存在创建新行而不是覆盖新行的问题
合并有很多问题。
我试过写我自己的函数
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 添加新的列或行。
谢谢!!
最佳答案
一种方法是使用 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
关于python - 在python中合并df,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72638155/