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
因此,我知道at
id=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。