Заменить значение для выбранной ячейки в панде DataFrame без использования индекса
Этот вопрос довольно похож на этот вопрос, но с одним ключевым отличием: я выбираю данные, которые хочу изменить, не по их индексу, а по некоторым критериям.
Если критерии, которые я применяю, возвращают одну строку, я ожидаю, что смогу установить значение определенного столбца в этой строке простым способом, но моя первая попытка не работает:
>>> d = pd.DataFrame({'year':[2008,2008,2008,2008,2009,2009,2009,2009],
... 'flavour':['strawberry','strawberry','banana','banana',
... 'strawberry','strawberry','banana','banana'],
... 'day':['sat','sun','sat','sun','sat','sun','sat','sun'],
... 'sales':[10,12,22,23,11,13,23,24]})
>>> d
day flavour sales year
0 sat strawberry 10 2008
1 sun strawberry 12 2008
2 sat banana 22 2008
3 sun banana 23 2008
4 sat strawberry 11 2009
5 sun strawberry 13 2009
6 sat banana 23 2009
7 sun banana 24 2009
>>> d[d.sales==24]
day flavour sales year
7 sun banana 24 2009
>>> d[d.sales==24].sales = 100
>>> d
day flavour sales year
0 sat strawberry 10 2008
1 sun strawberry 12 2008
2 sat banana 22 2008
3 sun banana 23 2008
4 sat strawberry 11 2009
5 sun strawberry 13 2009
6 sat banana 23 2009
7 sun banana 24 2009
Поэтому вместо того, чтобы устанавливать продажи бананов в воскресенье в 2009 году на 100, ничего не происходит! Какой самый лучший способ сделать это? В идеале решение должно использовать номер строки, так как вы обычно не знаете этого заранее!
Большое спасибо заранее, Роб
2 ответа
Много способов сделать это
1
In [7]: d.sales[d.sales==24] = 100
In [8]: d
Out[8]:
day flavour sales year
0 sat strawberry 10 2008
1 sun strawberry 12 2008
2 sat banana 22 2008
3 sun banana 23 2008
4 sat strawberry 11 2009
5 sun strawberry 13 2009
6 sat banana 23 2009
7 sun banana 100 2009
2
In [26]: d.loc[d.sales == 12, 'sales'] = 99
In [27]: d
Out[27]:
day flavour sales year
0 sat strawberry 10 2008
1 sun strawberry 99 2008
2 sat banana 22 2008
3 sun banana 23 2008
4 sat strawberry 11 2009
5 sun strawberry 13 2009
6 sat banana 23 2009
7 sun banana 100 2009
3
In [28]: d.sales = d.sales.replace(23, 24)
In [29]: d
Out[29]:
day flavour sales year
0 sat strawberry 10 2008
1 sun strawberry 99 2008
2 sat banana 22 2008
3 sun banana 24 2008
4 sat strawberry 11 2009
5 sun strawberry 13 2009
6 sat banana 24 2009
7 sun banana 100 2009
Не уверен насчет более старой версии панд, но в 0.16 значение конкретной ячейки может быть установлено на основе нескольких значений столбца.
Расширяя ответ, предоставляемый @waitingkuo, эту же операцию можно выполнить на основе значений нескольких столбцов.
d.loc[(d.day== 'sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100
Старый вопрос, но я удивлен, что никто не упомянул Numpy's .where()
функциональность (которая может быть вызвана непосредственно из модуля pandas).
В этом случае код будет:
d.sales = pd.np.where(d.sales == 24, 100, d.sales)
Насколько мне известно, это один из самых быстрых способов условно изменить данные в серии.