在groupby对象上应用算术和比较运算符

时间:2018-05-07 13:54:37

标签: python pandas comparison arithmetic-expressions

我有以下数据框(df):

ID  Age Code
1111    66  C18.2
1111    66  C98.4
1111    66  I50
1111    66  D20
1112    45  C54
1112    45  C54
1113    78  N18.3
1113    78  N18.6
1113    78  N18.2
1113    78  N18.1
1113    78  N18.1
1114    52  C40
1114    52  C19
1114    52  C100
1114    52  C100

我想首先使用df.groupby('ID')基于ID对数据进行分组,然后在这个分组数据上,我想应用一些算术和比较运算符。如果满足这些条件,请添加新列(df [risk])并输入H,否则在新风险列中输入L.我想对分组数据应用以下条件:

(Age > 65) & ((Code >= C00.00 & Code <= C99.00) | (Code >= N18.1 & Code < N18.6))

我尝试使用

为年龄做

df1=df.groupby('ID').apply(lambda x: x['Age']>65)

并且对于行显示True和False,具体取决于是否满足条件。但是如果它是True或L,我在新列中为False时无法添加。 由于Code列包含字符和浮点数,因此比较的第二部分有点困难。我所做的是使用以下方法将字符和数字分成两列:

df[['Let', 'Num']] = df['Code'].str.extract(r'([A-Za-z]+)([\d\.]+)', expand=True) df['Num'] = df['Num'].astype(float)

然后我可以使用以下条件选择数据:

df1 = df[(df['Age'] > 65) & (((df['Let']=='C') & ((df['Num'] >= 00.00) & (df['Num'] <= 99.00))) | ((df['Let']=='N') & ((df['Num'] >= 18.00) & (df['Num'] < 18.60))))]

上面的代码根据条件写了一个新的数据帧,但是如果你看到我的例子df,它只会分离满足条件的行(没有任何groupby特性)但是我想要所有相同ID的行而不管他们是否符合条件。我怎么能在groupby对象上应用类似的东西,并且还添加H(如果满足条件)或L(如果条件不满足)。

我想得到以下输出:

ID   Age  Code   risk
1111 66   C18.2  H
1111 66   C98.4  H
1111 66   I50    L
1111 66   D20    L
1112 45   C54    L
1112 45   C54    L
1113 78   N18.3  H
1113 78   N18.6  L
1113 78   N18.2  H
1113 78   N18.1  H
1113 78   N18.1  H
1114 52   C40    L
1114 52   C19    L
1114 52   C100   L
1114 52   C100   L

期待任何帮助。

0 个答案:

没有答案