Python 如何根据pandas中的特定列匹配行?
我有这样一个数据帧:Python 如何根据pandas中的特定列匹配行?,python,pandas,feature-extraction,Python,Pandas,Feature Extraction,我有这样一个数据帧: 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 id date event name time is_leader 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
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
事件中的每个成员都有行,但其中一行也有引线数据。我想排除包含有关引线数据的行,并添加一列is\u leader
,以指示成员是否为引线。大概是这样的:
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
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
因此,我知道atid=3
是基于时间的领先者,这里两者都是12:45。我们可以假设,这一次对任何其他成员来说都不一样
在熊猫身上实现这一点的有效方法是什么。这里我只举一个事件为例,但是我会有几个这样的函数,我需要为每个事件都这样做。您可以使用自定义函数f
,该函数返回新列is_leader
和True
,用于所有行,其中time
与列name
中带文本leader
的行的时间相同:
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
然后删除带有leader
by的行,并将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
为什么通过匹配时间列,id=3
是\u leader
值1
@vks。