我有一个主df
,如下所示:
index A B C
5 1 5 8
6 2 4 1
7 8 3 4
8 3 9 5
和我想添加到主df的辅助df2
,如下所示:
index A B
5 4 2
6 4 3
7 7 1
8 6 2
A和B列的名称相同,但是主df
包含许多列,而辅助df2
不包含。我想对常见的列求和,而其他列保持不变。
输出:
index A B C
5 5 7 8
6 6 7 1
7 15 4 4
8 9 11 5
尝试了df.join
,pd.merge
和groupby
的变体,但暂时没有运气。
最后一次尝试:
df.groupby('index').sum().add(df2.groupby('index').sum())
但这不会保留公共列。
pd.merge
我后缀为_x
和_y
答案 0 :(得分:2)
add
仅与intersection
中相同的列一起使用:
c = df.columns.intersection(df2.columns)
df[c] = df[c].add(df2[c], fill_value=0)
print (df)
A B C
index
5 5 7 8
6 6 7 1
7 15 4 4
8 9 11 5
如果仅使用add
,则不匹配的整数列将转换为float
:
df = df.add(df2, fill_value=0)
print (df)
A B C
index
5 5 7 8.0
6 6 7 1.0
7 15 4 4.0
8 9 11 5.0
编辑:
如果可能的话,请在公共列中输入
:print (df)
A B C D
index
5 1 5 8 a
6 2 4 1 e
7 8 3 4 r
8 3 9 5 w
print (df2)
A B C D
index
5 1 5 8 a
6 2 4 1 e
7 8 3 4 r
8 3 9 5 w
解决方案类似,仅按select_dtypes
过滤第一个数字列:
c = df.select_dtypes(np.number).columns.intersection(df2.select_dtypes(np.number).columns)
df[c] = df[c].add(df2[c], fill_value=0)
print (df)
A B C D
index
5 5 7 8 a
6 6 7 1 e
7 15 4 4 r
8 9 11 5 w
答案 1 :(得分:0)
不是最干净的方法,但它可能会起作用。
df_new = pd.DataFrame()
df_new['A'] = df['A'] + df2['A']
df_new['B'] = df['B'] + df2['B']
df_new['C'] = df['C']
print(df_new)
A B C
0 5 7 8
1 6 7 1
2 15 4 4
3 9 11 5