比较数据框中的每个值列和行

时间:2016-03-28 19:59:07

标签: python pandas dataframe

我有两个不同大小的数据帧,我想对四个不同列中的所有值进行比较,(两组两个)

基本上我想知道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)所以我知道这可能是一个更长的过程。

2 个答案:

答案 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的所有值,请左df1df2合并。在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)