pandas使用groupby转换创建布尔列

时间:2018-01-02 11:16:58

标签: python python-3.x pandas pandas-groupby

我正试图在GroupBy.transform上使用df创建一个布尔列,

id    type
1     1.00000
1     1.00000
2     2.00000
2     3.00000
3     2.00000

代码就像,

df['has_two'] = df.groupby('id')['type'].transform(lambda x: x == 2)

但是has_two不是布尔值,而是具有浮点值,例如0.0。我想知道为什么会这样。

更新

我创建了一个测试用例,

df = pd.DataFrame({'id':['1', '1', '2', '2', '3'], 'type':[1.0, 1.0, 2.0, 1.0, 2.0]})
df['has_2'] = df.groupby('id')['type'].transform(lambda x: x == 2)

这给了我,

   id  type  has_2
0  1   1.0    0.0
1  1   1.0    0.0
2  2   2.0    1.0
3  2   1.0    0.0
4  3   2.0    1.0

如果按照df['has_2'] = df['type'] == 2的建议使用jezrael,则可以,

   id  type  has_2
0  1   1.0  False
1  1   1.0  False
2  2   2.0   True
3  2   1.0  False
4  3   2.0   True

我在pandas==0.20.3上使用Python 3.5.2。我想知道发生了什么,我需要pandaspython 3更新吗?

更新

pandas更新为0.22.0解决了此问题。

2 个答案:

答案 0 :(得分:2)

对我来说它工作得很好,我得到布尔列:

df['has_two'] = df.groupby('id')['type'].transform(lambda x: x == 2)
print (df)
   id  type  has_two
0   1   1.0    False
1   1   1.0    False
2   2   2.0     True
3   2   3.0    False
4   3   2.0     True

但也许只能比较专栏:

df['has_two'] = df['type'] == 2
print (df)
   id  type  has_two
0   1   1.0    False
1   1   1.0    False
2   2   2.0     True
3   2   3.0    False
4   3   2.0     True

答案 1 :(得分:0)

使用此行

df['has_two'] = df.groupby('id')['type'].transform(lambda x: x == 2) == 2

为我工作:)