根据唯一列值进行比较,并根据条件设置标志

时间:2018-10-23 15:53:25

标签: python pandas dataframe lambda pandas-groupby

我对熊猫和数据框非常陌生。我以前使用过SQL。我在下面附了一张桌子:

    Sub     DOB         Groups      Mean Val  CheckVol
0   1112    1/1/1980    FirstVisit  6000      0
1   1121    2/2/1980    FirstVisit  6000      0
2   1138    3/3/1980    FirstVisit  6000      0
3   1227    4/4/1980    FirstVisit  6000      0
12  1443    1/1/1980    SecondVisit 5000      0
13  1443    2/2/1980    SecondVisit 5500      0
14  1481    3/3/1980    SecondVisit 6500      1
15  1482    4/4/1980    SecondVisit 5400      0
24  1483    2/2/1980    ThirdVisit  5400      0
25  1490    3/3/1980    ThirdVisit  5400      0

所以我要做的是基于DOB进行分组,因为这是唯一的,比较均值与首次访问。如果第二次访问大于第一次访问,则检查第三次访问,如果第三次访问小于第一次访问,则更改标签。因此,在示例表中,将14中的组更改为ThirdVisit,将25中的组更改为SecondVisit。我在想,也许在这种情况下创建一个新列作为名为checkVol的标志,而情况14将具有1。这就是我所拥有的,这是非常错误的:

checkVol = df.groupby('DOB').apply(lambda r: r)
#df.set_index('DOB', inplace=True)
df['checkVol'] = users

谢谢您的帮助。

凯文

1 个答案:

答案 0 :(得分:1)

IIUC,您可以groupby DOB列,然后在Mean Val列上使用您描述的条件进行转换。这将返回一个布尔列,因此您只需要将其转换为int

df['CheckVol'] = df.groupby('DOB')['Mean Val'].transform(lambda x: x > x.iloc[0]).astype(int)

>>> df
     Sub       DOB       Groups  Mean Val  CheckVol
0   1112  1/1/1980   FirstVisit      6000         0
1   1121  2/2/1980   FirstVisit      6000         0
2   1138  3/3/1980   FirstVisit      6000         0
3   1227  4/4/1980   FirstVisit      6000         0
12  1443  1/1/1980  SecondVisit      5000         0
13  1443  2/2/1980  SecondVisit      5500         0
14  1481  3/3/1980  SecondVisit      6500         1
15  1482  4/4/1980  SecondVisit      5400         0
24  1483  2/2/1980   ThirdVisit      5400         0
25  1490  3/3/1980   ThirdVisit      5400         0