[英]How To Select Identical rows from pandas dataframe based on certain columns
[英]How to match rows based on certain columns in pandas?
我有一個這樣的數據框:
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。 我們可以假設這次與其他任何成員都不一樣。
在熊貓中實現這一目標的有效方法是什么。 在這里,我僅以一個事件為例,但是我將其中幾個事件作為示例,我需要針對每個事件進行此操作。
您可以使用groupby
自定義功能f
其返回新列is_leader
與True
的地方是相同的所有行time
作為time
與文本行的leader
在列name
:
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
具有lambda函數的一排解決方案:
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 indexing
刪除帶有leader
的行,並將boolean
列強制轉換為int
:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.