2017-04-17 26 views
2

我有一個數據幀:爲標誌列在多行檢查有效性大熊貓

a  id flag1 flag2 
abc 1  1   0 
123 1  0   1 
xyz 2  1   0 
111 2  0   1 
qwe 3  1   0 
qwe 3  1   0 
mmm 4  1   0 
222 4  0   1 

我想找到id數,其中既FLAG1和FLAG2是1

例如。 爲ID 1,在第一行中,FLAG1 = 1和FLAG2 = 0,並且第二行,FLAG1 = 0和FLAG2 = 1

我的最終輸出應是這樣的

a id flag1 flag2 
abc 1  1   0 
123 1  0   1 
xyz 2  1   0 
111 2  0   1 
mmm 4  1   0 
222 4  0   1 

或僅id列也可以在列表中工作[1,2,4]

因爲對於id = 3,flag1在id = 3和flag 2都爲0的行中都是1,所以我必須忽略它。

我試圖寫一個函數,但失敗了。

def checkValidTransactionRow(frame): 
df['id'][(df['flag1']==1) & (df['flag2']==1) ].unique() 
+0

@jezrael你能看一下嗎? – Shubham

+0

在我看來,兩種解決方案都很好,但似乎maxu解決方案更好。 – jezrael

回答

3

後丟棄行count_max1和count_max2試試這個辦法:

In [23]: ids = df.groupby('id')['flag1','flag2'].apply(lambda x: x.eq(1).any()).all(1) 

In [24]: ids 
Out[24]: 
id 
1  True 
2  True 
3 False 
4  True 
dtype: bool 

In [25]: ids.index[ids] 
Out[25]: Int64Index([1, 2, 4], dtype='int64', name='id') 

說明:

In [26]: df.groupby('id')['flag1','flag2'].apply(lambda x: x.eq(1).any()) 
Out[26]: 
    flag1 flag2 
id 
1 True True 
2 True True 
3 True False 
4 True True 

x.eq(1).any()相同(x == 1).any() - 即返回True如果至少一個值在x系列等於1,否則返回False

UPDATE:

In [34]: ids.index[ids].values 
Out[34]: array([1, 2, 4], dtype=int64) 

In [35]: ids.index[ids].values.tolist() 
Out[35]: [1, 2, 4] 
+0

我得到'類型(ids)'作爲系列,我可以得到ids在哪裏它只是真實的? 還有什麼'lambda x:x.eq(1).any()'是什麼意思? – Shubham

+0

@SRingne,當然,請參閱UPDATE ... – MaxU

+0

如果可能的話,你可以解釋一下「lambda x:x.eq(1).any()」的意思嗎? 我越來越正確的答案,但沒有明白代碼 – Shubham

1

我相信有實現這一目標的一個更好的辦法,但你可以嘗試:

df['count_max1'] = df.groupby(['id'])['flag1'].transform(max) 
df['count_max2'] = df.groupby(['id'])['flag2'].transform(max) 
# Select rows 
df[(df['count_max1'] ==1 & (df['count_max2'] == 1)] 

什麼變換矩陣的作用是:

a  id flag1 flag2 count_max1 count_max2 
abc 1  1   0   1   1 
123 1  0   1   1   1 
xyz 2  1   0   1   1 
111 2  0   1   1   1 
qwe 3  1   0   1   0 
qwe 3  1   0   1   0 
mmm 4  1   0   1   1 
222 4  0   1   1   1 

如果選擇行的最後輸出將是:

a id flag1 flag2 count_max1 count_max2 
abc 1  1   0  1   1 
123 1  0   1  1   1 
xyz 2  1   0  1   1 
111 2  0   1  1   1 
mmm 4  1   0  1   1 
222 4  0   1  1   1 

你可以

+0

變換(max)有什麼作用? – Shubham

+0

檢查編輯請 – edyvedy13

+0

是的,但我不明白爲什麼行'qwe' count_max2是0 – Shubham