2016-03-01 64 views
0

最近,我从matlab切换到python和pandas。它一直在努力,但我坚持有效地解决以下问题。对于我的分析,我不得不dataframes看起来有点像这样:比较两个不同数据框的两列

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中,并将其与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 =

In_Number  In_Total 
0  we 1    4 
1  sz 2    3 
2  dt 6    1 
3  dt 7    1 
构造下面DFC

然后,我将它与dfB合并,以便通过比较dfB中的列来确定值是否相同。在这种情况下,我必须结束删除列。有没有更好/更快的方法来做到这一点?我认为有一种方法可以非常有效地完成熊猫的一项重要功能。我试图查看lookupmap,但我无法使它工作。

感谢您的帮助!

回答

0

您可以通过In列尝试mergedfBdfAgroupbycount,然后进行比较合并列和最后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 without 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 
+0

嗨Jezrael,谢谢你的回复!合并功能中的group by功能看起来很棒。虽然,出了点问题。也就是说,我的数据比上面的虚拟数据更大。因此有时出现dfA中的“In”值不在dfB中的“In”中。 在您的代码中,其他值将被删除。有没有办法来防止这种情况?我认为合并会照顾到这一点。 编辑:我想我自己用pd.merge函数中的'= left'来修复它。 有没有可能扩展我关于下一步的问题? – Uis234

+0

@ Uis234 - 超级。很高兴可以帮助你!关于延伸quesiton - 我认为更好的是创造新的问题。也许如果它只是小小的改变 - 你可以修改这个问题。如果我的回答很有帮助,请不要忘记[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)它。谢谢。 – jezrael

+0

完成!再次感谢!顺便说一句,重命名的方法是非常好的。 – Uis234