2016-10-18 43 views
2

我有一個數據幀是這樣的:如何匹配基於熊貓中某些列的行?

id  date   event name  time 
1  2016-10-01 A  leader 12:45 
2  2016-10-01 A  AA  12:87 
3  2016-10-01 A  BB  12:45 

有在事件各成員行,但一個行具有領先地位的數據也是如此。我想排除有關領導者的數據的行,並添加一列is_leader以指示成員是否是領導者。事情是這樣的:

id  date   event name  time is_leader 
2  2016-10-01 A  AA  12:87 0 
3  2016-10-01 A  BB  12:45 1 

所以,我知道在id=3是基於時間,這是爲12:45都在這裏的領導者。我們可以假設這次對其他成員來說不會是一樣的。

什麼是在熊貓中實現這一點的有效方法。在這裏我只舉了一個事件作爲例子,但是我會有幾個這樣的事情,而且我需要爲每個事件做這件事。

+0

爲什麼是'ID = 3''is_leader'值'1' – vks

+0

@vks由時間列匹配。 – sfactor

回答

3

您可以使用groupby自定義功能fTrue所有行返回新列is_leader其中name列相同time與文本leadertime

print (df) 
    id  date event name time 
0 1 2016-10-01  A leader 12:45 
1 2 2016-10-01  A  AA 12:87 
2 3 2016-10-01  A  BB 12:45 
3 1 2016-10-01  B leader 12:15 
4 2 2016-10-01  B  AA 12:15 
5 3 2016-10-01  B  BB 12:45 

def f(x): 
    x['is_leader'] = x.time == x.ix[x['name'] == 'leader', 'time'].iloc[0] 
    return x 

df= df.groupby('event').apply(f) 
print (df) 
    id  date event name time is_leader 
0 1 2016-10-01  A leader 12:45  True 
1 2 2016-10-01  A  AA 12:87  False 
2 3 2016-10-01  A  BB 12:45  True 
3 1 2016-10-01  B leader 12:15  True 
4 2 2016-10-01  B  AA 12:15  True 
5 3 2016-10-01  B  BB 12:45  False 

一行解決方案帶拉姆達功能:

df['is_leader'] = df.groupby('event') 
        .apply(lambda x: x.time == x.ix[x['name'] == 'leader', 'time'].iloc[0]) 
        .reset_index(drop=True, level=0) 
print (df) 
    id  date event name time is_leader 
0 1 2016-10-01  A leader 12:45  True 
1 2 2016-10-01  A  AA 12:87  False 
2 3 2016-10-01  A  BB 12:45  True 
3 1 2016-10-01  B leader 12:15  True 
4 2 2016-10-01  B  AA 12:15  True 
5 3 2016-10-01  B  BB 12:45  False 

然後通過boolean indexingleader刪除行,並投booleanint

df = df[df.name != 'leader'] 
df.is_leader = df.is_leader.astype(int) 
print (df) 
    id  date event name time is_leader 
1 2 2016-10-01  A AA 12:87   0 
2 3 2016-10-01  A BB 12:45   1 
4 2 2016-10-01  B AA 12:15   1 
5 3 2016-10-01  B BB 12:45   0