import pandas as pd
df = pd.read_table('data', sep='\s+')
mask = ((df['Status'] == 'D')
& df['Species'].isin(['Carex','Carcra']))
mask = mask.groupby(df['ID']).transform('any')
df.loc[mask, 'Class'] = 'Wet'
print(df)
дает
ID Class Status Species
0 1 Wet D Carex
1 1 Wet C Eupesu
2 1 Wet C Poapra
3 2 Wet D Carcra
4 2 Wet C Eupesu
5 2 Wet C Poapra
6 3 Limy D Poapra
7 3 Limy C Eupesu
8 3 Limy C Poapra
Назначение
df['mask'] = ((df['Status'] == 'D')
& df['Species'].isin(['Carex','Carcra']))
делает df
выглядеть следующим образом:
In [166]: df
Out[166]:
ID Class Status Species mask
0 1 Sands D Carex True
1 1 Sands C Eupesu False
2 1 Sands C Poapra False
3 2 Limy D Carcra True
4 2 Limy C Eupesu False
5 2 Limy C Poapra False
6 3 Limy D Poapra False
7 3 Limy C Eupesu False
8 3 Limy C Poapra False
Теперь (благодаря DSM):
mask = ((df['Status'] == 'D')
& df['Species'].isin(['Carex','Carcra']))
mask = mask.groupby(df['ID']).transform('any')
группа mask
по df['ID']
и присваивает True
всех строк этой группы, если любого значения в исходном mask
правда, и False
иначе.
In [168]: mask
Out[168]:
0 True
1 True
2 True
3 True
4 True
5 True
6 False
7 False
8 False
dtype: bool
df.loc
может быть использован для выбора строк и столбцов из df
. df.loc[mask]
выбирает строки, где mask
верно:
In [169]: df.loc[mask]
Out[169]:
ID Class Status Species mask
0 1 Sands D Carex True
1 1 Sands C Eupesu False
2 1 Sands C Poapra False
3 2 Limy D Carcra True
4 2 Limy C Eupesu False
5 2 Limy C Poapra False
df.loc[mask, 'Class']
дополнительно выбирает столбец Class
:
In [170]: df.loc[mask, 'Class']
Out[170]:
0 Sands
1 Sands
2 Sands
3 Limy
4 Limy
5 Limy
Name: Class, dtype: object
df.loc[mask]['Class'] = value
может не изменить df
с момента df.loc[mask]
возвращает копию. (То же самое справедливо и для df[mask]['Class'] = value
). Использование [...]
дважды называется «цепной индексацией», и проблему можно избежать, если мы избежим связывания индексов.
Таким образом, вместо того, чтобы использовать [...]
дважды, использование, df.loc[mask, 'Class'] = 'Wet'
:
In [172]: df
Out[172]:
ID Class Status Species
0 1 Wet D Carex
1 1 Wet C Eupesu
2 1 Wet C Poapra
3 2 Wet D Carcra
4 2 Wet C Eupesu
5 2 Wet C Poapra
6 3 Limy D Poapra
7 3 Limy C Eupesu
8 3 Limy C Poapra
Я упрощая CSV здесь, все, что нужно изменить, потому что я собираюсь быть суммированием на основе 'ID' в конце концов, и если только значение 'D' изменяет значение из' C', будет оставлено в старом классе. Надеюсь, что это имеет смысл. –
Пожалуйста, сделайте желаемый результат согласованным с критериями, как вы заявили об этом в вопросе. – unutbu
Да, я понял, что это может повлиять на вещи, извините. Все еще обволакиваю все это. –