查找所有负数

时间:2017-12-05 15:27:22

标签: python pandas

我的数据框如下所示:

Person    Number
 BOB       1.23
 BOB      -1.23
 Jeff      18.01
 Jack      82.04
 Jack      14.02
 Jeff     -18.01

我想要做的是查看Persons列,然后说出BOB名称下是否有多个人,我们知道BOB是唯一的,所以它是同一个人。我想查看Number列,如果它们是BOB的负值以及Postive,我想将这两个数字都改为Zero。此外,对于像杰克这样有两个正数的案例,我不想为他做任何事情。所以我想要做的就是找到Person相同的位置,如果它们是同一个名称的负值和正值,则将两个数字都改为0

所以最终的数据框看起来像......

Person    Number
 BOB       0
 BOB       0
 Jeff      0
 Jack      82.04
 Jack      14.02
 Jeff      0

我遇到的另一个问题是Python没有适当地检测到负数,因此它将负数改为看起来像这样($ 4.00)而不是像-1.23那样。我只是不确定如何达到指定的答案,所以任何帮助将不胜感激,谢谢

2 个答案:

答案 0 :(得分:4)

你可以找到那些具有正值,负值然后是交点的人。

pos = set(df.loc[df.Number > 0, 'Person'])
neg = set(df.loc[df.Number < 0, 'Person'])
intersection = pos & neg

然后设置Number = 0,其中Person在此交叉点。

df.loc[df.Person.isin(intersection), 'Number'] = 0

df
    Person  Number
0   BOB     0.00
1   BOB     0.00
2   Jeff    0.00
3   Jack    82.04
4   Jack    14.02
5   Jeff    0.00

请注意,输出与您发布的预期输出不同,但对我而言,您所询问的内容与预期输出之间似乎存在一些矛盾。我已经离开了:

  

所以我想做的就是找到Person相同的位置,如果它们在同一名称下存在负值和正值,则将两个数字都更改为0

答案 1 :(得分:0)

让我们使用filter.loc

来实现
df1=df.groupby('Person').filter(lambda x : x.Number.lt(0).any())
df.loc[df1.index,"Number"]=0
df
Out[608]: 
  Person  Number
0    BOB    0.00
1    BOB    0.00
2   Jeff    0.00
3   Jack   82.04
4   Jack   14.02
5   Jeff    0.00

或使用isin

df.loc[df.Person.isin(df.loc[df.Number<0,'Person'].tolist()),'Number']=0
df
Out[616]: 
  Person  Number
0    BOB    0.00
1    BOB    0.00
2   Jeff    0.00
3   Jack   82.04
4   Jack   14.02
5   Jeff    0.00