我有两个不同大小的数据帧,我想对四个不同列中的所有值进行比较,(两组两个)
基本上我想知道df1 ['A'] == df2 ['A']&其中df1 ['B'] == df2 ['B']并返回df1 ['C']的值加上df2 ['C']的值
import pandas as pd
df1 = pd.DataFrame({"A": [1, 2, 3, 4, 3], "B": [2, 5, 4, 7, 5], "C": [1, 2, 8, 0, 0]})
df2 = pd.DataFrame({"A": [1, 3, 2, 4, 8], "B": [5, 5, 4, 9, 1], "C": [1, 3, 3, 4, 6]})
df1:
A B C
0 1 2 1
1 2 5 2
2 3 4 8
3 4 7 0
4 3 5 0
...
df2:
A B C
0 1 5 1
1 3 4 3
2 2 5 4
3 4 9 4
5 8 1 6
...
in: df1['A'] == df2['A'] & where df1['B'] == df2['B']
df1['D'] = df1['C'] + df2['C']
out: df1:
A B C D
0 1 2 1 nan
1 2 5 2 6
2 3 4 8 11
3 4 7 0 nan
4 3 5 0 nan
我的实际数据帧要大得多(1200条行的数据,“A”列的值范围从1到700,“B”的值从1到300)所以我知道这可能是一个更长的过程。
答案 0 :(得分:0)
您可以先合并两个数据框
In [145]: dff = pd.merge(df1, df2, on=['A', 'B'], how='left')
In [146]: dff
Out[146]:
A B C_x C_y
0 1 2 1 NaN
1 2 5 2 4
2 3 4 8 3
3 4 7 0 NaN
然后,在C_-{like}
列上采用行方式求和,其中不存在空值,然后用零填充NaN。
In [147]: dff['C'] = dff.filter(regex='C_').sum(skipna=False, axis=1).fillna(0)
In [148]: dff
Out[148]:
A B C_x C_y C
0 1 2 1 NaN 0
1 2 5 2 4 6
2 3 4 8 3 11
3 4 7 0 NaN 0
并且,您可以删除/选择所需的列。
答案 1 :(得分:0)
您可以merge
列A和B上的两个数据框。由于您希望保留df1
的所有值,请左df1
和df2
合并。在A和B不匹配的地方,来自df2
的合并列C将为空。在合并之后,只需重命名合并的列并进行求和。
# Do a left merge, keeping df1 column names unchanged.
df1 = pd.merge(df1, df2, how='left', on=['A', 'B'], suffixes=('', '_2'))
# Add the two columns, fill locations that don't match with zero, and rename.
df1['C_2'] = df1['C_2'].add(df1['C']).fillna(0)
df1.rename(columns={'C_2': 'D'}, inplace=True)