如何通过部分标签

时间:2018-01-12 03:29:42

标签: python pandas pandas-groupby

您能否建议我过滤user_id = 101的前三个注释,其label = 1,而不触及label = 0的注释。我也需要保留订单。感谢您的帮助。

import numpy as np
import pandas as pd

data = np.array([['user_id','comment','label'],
            [100,'First comment',0],
            [101,'Buy viagra',1],
            [102,'Second comment',0],
            [101,'Third comment',0],
            [103,'Fourth comment',0],
            [101,'Buy drugs',1],
            [104,'Fifth comment',0],
            [101,'Buy icecream',1],
            [105,'Sixth comment',0],
            [101,'Buy something',1]])
df = pd.DataFrame(data=data[1:,0:],columns = data[0,0:])

我正在寻找以下输出:

 0     100    First comment     0
 1     101       Buy viagra     1
 2     102   Second comment     0
 3     101    Third comment     0
 4     103   Fourth comment     0
 5     101        Buy drugs     1
 6     104    Fifth comment     0
 7     101     Buy icecream     1
 8     105    Sixth comment     0

我尝试通过

获取user_id = 101的前三个注释
 q = df.groupby('user_id').head(3)

但显然这只是前3条评论而不管标签是什么,并给我一个不正确的结果。

1 个答案:

答案 0 :(得分:1)

创建一个布尔掩码,并使用布尔索引/ loc / isin / query / eval进行相应的过滤。

m = m = df.user_id.eq('101') & df.label.eq('1')

i = df[m].head(3)
j = df[~m]

df = pd.concat([i, j]).sort_index()
df

  user_id         comment label
0     100   First comment     0
1     101      Buy viagra     1
2     102  Second comment     0
3     101   Third comment     0
4     103  Fourth comment     0
5     101       Buy drugs     1
6     104   Fifth comment     0
7     101    Buy icecream     1
8     105   Sixth comment     0

此过滤过程的优点是您保留索引,因此后续的sort_index调用会在您将两个部分连接在一起后修复排序。