比较两个不同数据框的两列

Compare two columns of two different dataframes

最近,我用 pandas 从 matlab 切换到 python。它一直运行良好,但我坚持有效地解决以下问题。对于我的分析,我必须使用看起来像这样的数据框:

dfA =
     NUM      In        Date
0   2345    we 1    01/03/16
1   3631    we 1    23/02/16
2   2564    we 1    12/02/16
3   8785    sz 2    01/03/16
4   4767    dt 6    01/03/16
5   3452    dt 7    23/02/16
6   2134    sz 2    01/03/16
7   3465    sz 2    01/03/16

dfB
    In   Count_Num
0   we 1         3
1   sz 2         2
2   dt 6         3
3   dt 7         1

我想执行的是一个操作,将 dfA 中所有 "In" 的所有 'Num' 相加,并将其与 dfB 中的 "Count_num" 进行比较。之后,如果比较是 True 或 False,我想在 dfB 中添加一列到 return。在上面的例子中,操作应该return this:

dfB
    In   Count_Num   Check
0   we 1         3   True
1   sz 2         2   False
2   dt 6         1   True 
3   dt 7         1   True

我的做法:

使用 value_counts() 和 pd.DataFrame,我从 dfA 构建了以下 dfC dfC =

   In_Number       In_Total
0       we 1              4
1       sz 2              3
2       dt 6              1
3       dt 7              1

然后我将它与 dfB 合并,然后通过比较 dfB 中的列来检查值是否相同。在这种情况下,我必须结束删除列。有 better/faster 的方法吗?我认为有一种方法可以使用 pandas 一个很棒的函数来非常有效地做到这一点。我已经尝试研究 lookupmap,但我无法让它工作。

感谢您的帮助!

您可以尝试 merge dfB and dfA with groupby and count by column In, then add new column check for comparison merged columns and last dropNUM:

print dfA
    NUM    In      Date
0  2345  we 1  01/03/16
1  3631  we 1  23/02/16
2  2564  we 1  12/02/16
3  8785  sz 2  01/03/16
4  4767  dt 6  01/03/16
5  3452  dt 7  23/02/16
6  2134  sz 2  01/03/16
7  3465  sz 2  01/03/16

print dfB
     In  Count_Num
0  we 1          3
1  sz 2          2
2  dt 6          3
3  dt 7          1
print dfA.groupby('In', as_index=False)['NUM'].count()
     In  NUM
0  dt 6    1
1  dt 7    1
2  sz 2    3
3  we 1    3

df = pd.merge(dfB, dfA.groupby('In', as_index=False)['NUM'].count(), on=['In'])
print df
     In  Count_Num  NUM
0  we 1          3    3
1  sz 2          2    3
2  dt 6          3    1
3  dt 7          1    1

df['check'] = df['NUM'] == df['Count_Num']
df = df.drop('NUM', axis=1)
print df
     In  Count_Num  check
0  we 1          3   True
1  sz 2          2  False
2  dt 6          3  False
3  dt 7          1   True

或者你可以使用 rename 而不使用 drop:

df = pd.merge(dfB, dfA.groupby('In', as_index=False)['NUM'].count(), on=['In'])
print df
     In  Count_Num  NUM
0  we 1          3    3
1  sz 2          2    3
2  dt 6          3    1
3  dt 7          1    1

df['NUM'] = df['NUM'] == df['Count_Num'] 
df = df.rename(columns={'NUM':'Check'})
print df
     In  Count_Num  Check
0  we 1          3   True
1  sz 2          2  False
2  dt 6          3  False
3  dt 7          1   True