我的数据框如下所示:
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那样。我只是不确定如何达到指定的答案,所以任何帮助将不胜感激,谢谢
答案 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