Подтвердить что ты не робот

Заменить значение для выбранной ячейки в панде 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, ничего не происходит! Какой самый хороший способ сделать это? В идеале решение должно использовать номер строки, поскольку вы обычно не знаете этого заранее!

4b9b3361

Ответ 1

Многие способы сделать это

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

Ответ 2

Не уверен в более старой версии pandas, но в 0.16 значение конкретной ячейки может быть установлено на основе нескольких значений столбца.

Расширяя ответ, предоставленный @waitingkuo, ту же операцию можно также выполнить на основе значений нескольких столбцов.

d.loc[(d.day== 'sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100

Ответ 3

Старый вопрос, но я удивлен, что никто не упомянул функциональность numpy .where() (которую можно вызвать непосредственно из модуля pandas).

В этом случае код будет:

d.sales = pd.np.where(d.sales == 24, 100, d.sales)

Насколько мне известно, это один из самых быстрых способов условно изменить данные в серии.