繁体   English   中英

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

[英]Compare two columns of two different dataframes

最近,我使用熊猫从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中添加一列以返回。 在上面的示例中,该操作应返回以下内容:

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中的列来检查其值是否相同。 在这种情况下,我必须结束删除列。 有没有更好/更快的方法来做到这一点? 我认为有一种方法可以有效地利用熊猫的一项出色功能。 我试图研究lookupmap ,但是无法使其正常工作。

谢谢您的帮助!

您可以尝试merge dfBdfAgroupby mergedfA In列进行count ,然后为比较合并的列和最后dropNUM添加新的列check

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM