Условное копирование на уровне идентификатора - PullRequest
2 голосов
/ 14 июля 2020

У меня есть фрейм данных, который выглядит так:

ID   VALUE        
1     Low         
1     High        
1     Medium      
1     Very_High   
2     Low         
2     Medium      
2     Medium      

Я хочу go через каждый уровень идентификатора и применяя определенные условия, преобразовать столбец VALUE. Условия таковы:

i. Если в любой из строк этого идентификатора есть «Very_High», сделайте все строки для этого идентификатора «Very_High»

ii. Иначе Если в любой из строк этого идентификатора стоит «Высокий», сделайте все строки для этого идентификатора «Высокими»

iii. Иначе Если в любой из строк этого идентификатора стоит «Средний», сделайте все строки для этого идентификатора «Средним»

iv. В противном случае сделайте строки в идентификаторе «Низкими»

Ожидаемый результат фрейма данных:

ID   VALUE
1    Very_High
1    Very_High
1    Very_High
1    Very_High
2    Medium
2    Medium
2    Medium

Это то, что я пробовал, но не работал:

if (df_new.groupby('ID')['VALUE']=='Very_High').any():
    df_new = df_new.loc[df_new.groupby('ID')['VALUE'] == 'Very_High'].copy()
elif (df_new.groupby('ID')['VALUE'] =='High').any():
    df_new = df_new.loc[df_new.groupby('ID')['VALUE'] == 'High'].copy()
elif (df_new.groupby('ID')['VALUE']=='Medium').any():
    df_new = df_new.loc[df_new.groupby('ID')['VALUE'] == 'Medium'].copy()
else: 
    df_new = df_new.loc[df_new.groupby('ID')['VALUE'] == 'Low'].copy()

1 Ответ

1 голос
/ 14 июля 2020

Мы можем сделать Categorical, затем merge это.

df.VALUE=pd.Categorical(df.VALUE, ['Low','Medium','High','Very_High'], ordered=True)
df=df.drop('VALUE', 1).merge(df.sort_values('VALUE').drop_duplicates('ID',keep='last'),how='left', on ='ID')
Out[244]: 
   ID      VALUE
0   1  Very_High
1   1  Very_High
2   1  Very_High
3   1  Very_High
4   2     Medium
5   2     Medium
6   2     Medium
...