Създадох Pandas DataFrame
df = DataFrame(index=['A','B','C'], columns=['x','y'])
и получих това
x y A NaN NaN B NaN NaN C NaN NaN
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
Препоръчителният начин (според поддържащите) за задаване на стойност е:
df.ix['x','C']=10
Използването на 'верижно индексиране' (df['x']['C']
) може да доведе до проблеми.
Вижте: