pandas groupby ID然后查找所有行的risk列中出现的'H'字符

时间:2018-05-08 10:32:34

标签: python pandas pandas-groupby

我有一个示例Pandas dataframe df:

ID    risk
1111  H
1111  H
1111  L
1111  L
1112  L
1112  L
1113  H
1113  L
1113  H
1113  H
1113  H
1114  L
1114  L
1114  L
1114  L

我想根据ID对数据进行分组,然后在风险列中查找“H”字符的出现位置。如果特定ID的任何行中的risk列中存在任何“H”,我想用“H”更改Risk列中该特定ID的所有行。这就是我想要的:

ID    risk
1111  H
1111  H
1111  H
1111  H
1112  L
1112  L
1113  H
1113  H
1113  H
1113  H
1113  H
1114  L
1114  L
1114  L
1114  L

我有一个非常大的数据框,所以我怎么能有效地做到这一点?

1 个答案:

答案 0 :(得分:3)

首先按boolean indexing查找所有唯一loc,然后按numpy.wherev = df.loc[df['risk'] == 'H', 'ID'].unique() df['risk'] = np.where(df['ID'].isin(v), 'H', df['risk']) isin替换值:

df.loc[df['ID'].isin(df.loc[df['risk'] == 'H', 'ID'].unique()), 'risk'] = 'H'

另一种解决方案:

groupby

m = df.groupby('ID')['risk'].transform(lambda x: (x == 'H').any()) #better groupby alternative #m = df['risk'].eq('H').groupby(df['ID']).transform('any') df['risk'] = np.where(m, 'H', df['risk']) 最慢的解决方案:

print (df)
      ID risk
0   1111    H
1   1111    H
2   1111    H
3   1111    H
4   1112    L
5   1112    L
6   1113    H
7   1113    H
8   1113    H
9   1113    H
10  1113    H
11  1114    L
12  1114    L
13  1114    L
14  1114    L
{{1}}