2017-08-24 32 views
1

我想對多列執行逐行比較。我想要一個單一的系列,指示一行中的所有條目(多個列)是否與前一行相同。在Python中,比較多列的行差異

可以說我有以下的數據幀

import pandas as pd 
df = pd.DataFrame({'A' : [1, 1, 1, 2, 2], 
        'B' : [2, 2, 3, 3, 3], 
        'C' : [1, 1, 1, 2, 2]}) 

我可以比較所有行,所有列

>>> df.diff().eq(0) 
     A  B  C 
0 False False False 
1 True True True 
2 True False True 
3 False True False 
4 True True True 

這給出了一個數據幀單獨比較每個系列。我想要的是一個系列中所有列的比較。

我可以通過循環

compare_all = df.diff().eq(0) 
compare_tot = compare_all[compare_all.columns[0]] 
for c in compare_all.columns[1:]: 
    compare_tot = compare_tot & compare_all[c] 

實現這一目標這給

>>> compare_tot 
0 False 
1  True 
2 False 
3 False 
4  True 
dtype: bool 

預期。

是否有可能實現這一點與單線,即沒有循環?

回答

1

你需要all

In [1306]: df.diff().eq(0).all(1) 
Out[1306]: 
0 False 
1  True 
2 False 
3 False 
4  True 
dtype: bool 
2
>>> (df == df.shift()).all(axis=1) 
0 False 
1  True 
2 False 
3 False 
4  True 
dtype: bool 
+0

我是正確的假設,DIFF() - 功能僅適用於數字數據,而這個工程的字符串呢? – mortysporty

+1

正確。如果值不能與字符串的情況不同,那麼'diff'方法會引發錯誤。 – Alexander