pandas groupby ID, затем ищите вхождение символа 'H' в столбце риска всех строк - PullRequest
0 голосов
/ 08 мая 2018

У меня есть пример 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

Я хочу сгруппировать данные на основе идентификатора, а затем искать наличие символа «H» в столбце риска. Если в столбце риска в любой из строк определенного идентификатора существует какая-либо буква «H», я бы хотел поменять все строки этого конкретного идентификатора в колонке риска на «H». Вот что я хотел бы получить:

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 голосов
/ 08 мая 2018

Сначала найдите все уникальные ID по boolean indexing, а затем замените значения на numpy.where или loc и isin:

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

Другое решение:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...