Задаване на стойност за конкретна клетка в pandas DataFrame чрез използване на индекс

Създадох Pandas DataFrame

df = DataFrame(index=['A','B','C'], columns=['x','y'])

и получих това

    x y
A NaN NaN
B NaN NaN
C NaN NaN

След това искам да присвоя стойност на определена клетка, например за ред 'C' и колона 'x'. Очаквах да получа такъв резултат:
    x y
A NaN NaN
B NaN NaN
C 10 NaN

с този код:

df.xs('C')['x'] = 10

но съдържанието на df не се е променило. В DataFrame отново има само NaN.

Някакви предложения?

Решение

RukTech's answer, df.set_value('C', 'x', 10), е далеч по-бърз от вариантите, които съм предложил по-долу. Въпреки това, тя е определена за изчерпване.

Занапред препоръчителният метод е .iat/.at.


Защо df.xs('C')['x']=10 не работи:

df.xs('C') по подразбиране връща нова рамка от данни с копие на данните, така че

df.xs('C')['x']=10

модифицира само тази нова рамка от данни.

df['x'] връща изглед на рамката от данни df, така че

df['x']['C'] = 10

модифицира самия df.

Предупреждение: Понякога е трудно да се предвиди дали дадена операция връща копие или изглед. По тази причина документите препоръчват да се избягват присвоявания с "верижно индексиране".


Така че препоръчителната алтернатива е

df.at['C', 'x'] = 10

която изменя df.


In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop

In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop

In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
Коментари (7)

Актуализация: Методът .set_value ще бъде изчерпан. .iat/.at са добри заместители, но за съжаление pandas предоставя малко документация


Най-бързият начин да направите това е като използвате set_value. Този метод е ~100 пъти по-бърз от метода .ix. Например:

df.set_value('C', 'x', 10)

Коментари (8)

Препоръчителният начин (според поддържащите) за задаване на стойност е:

df.ix['x','C']=10

Използването на 'верижно индексиране' (df['x']['C']) може да доведе до проблеми.

Вижте:

Коментари (1)