patternpythonCriticalCanonical
Set value for particular cell in pandas DataFrame using index
Viewed 0 times
indexsetdataframeforusingpandascellvalueparticular
Problem
I have created a Pandas DataFrame
Now, I would like to assign a value to particular cell, for example to row
with this code:
However, the contents of
df = DataFrame(index=['A','B','C'], columns=['x','y'])
Now, I would like to assign a value to particular cell, for example to row
C and column x. In other words, I would like to perform the following transformation: x y x y
A NaN NaN A NaN NaN
B NaN NaN ⟶ B NaN NaN
C NaN NaN C 10 NaN
with this code:
df.xs('C')['x'] = 10
However, the contents of
df has not changed. The dataframe contains yet again only NaNs. How do I what I want?Solution
RukTech's answer,
Going forward, the recommended method is
Why
modifies this new dataframe only.
modifies
Warning: It is sometimes difficult to predict if an operation returns a copy or a view. For this reason the docs recommend avoiding assignments with "chained indexing".
So the recommended alternative is
which does modify
df.set_value('C', 'x', 10), is far and away faster than the options I've suggested below. However, it has been slated for deprecation.Going forward, the recommended method is
.iat/.at.Why
df.xs('C')['x']=10 does not work:df.xs('C') by default, returns a new dataframe with a copy of the data, so df.xs('C')['x']=10modifies this new dataframe only.
df['x'] returns a view of the df dataframe, so df['x']['C'] = 10modifies
df itself.Warning: It is sometimes difficult to predict if an operation returns a copy or a view. For this reason the docs recommend avoiding assignments with "chained indexing".
So the recommended alternative is
df.at['C', 'x'] = 10which does modify
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 loopCode Snippets
df.xs('C')['x']=10df['x']['C'] = 10df.at['C', 'x'] = 10In [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 loopContext
Stack Overflow Q#13842088, score: 955
Revisions (0)
No revisions yet.