Change an element in the last row of a DataFrame

Question:

I set up a simple DataFrame in pandas:

a = pandas.DataFrame([[1,2,3], [4,5,6], [7,8,9]], columns=['a','b','c'])
>>> print a
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

I would like to be able to alter a single element in the last row of. In pandas==0.13.1 I could use the following:

a.iloc[-1]['a'] = 77
>>> print a
    a  b  c
0   1  2  3
1   4  5  6
2  77  8  9

but after updating to pandas==0.14.1, I get the following warning when doing this:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead

The problem of course being that -1 is not an index of a, so I can’t use loc. As the warning indicates, I have not changed column 'a' of the last row, I’ve only altered a discarded local copy.

How do I do this in the newer version of pandas? I realize I could use the index of the last row like:

a.loc[2,'a'] = 77

But I’ll be working with tables where multiple rows have the same index, and I don’t want to reindex my table every time. Is there a way to do this without knowing the index of the last row before hand?

Asked By: Mike

||

Answers:

Alright I’ve found a way to solve this problem without chaining, and without worrying about multiple indices.

a.iloc[-1, a.columns.get_loc('a')] = 77
>>> a
   a  b  c
0  1  2  3
1  4  5  6
2 77  8  9

I wasn’t able to use iloc before because I couldn’t supply the column index as an int, but get_loc solves that problem. Thanks for the helpful comments everyone!

Answered By: Mike

For pandas 0.22,

a.at[a.index[-1], 'a'] = 77

this is just one of the ways.

Answered By: PallavBakshi

Taking elements from the solutions of @PallavBakshi and @Mike, the following works in Pandas >= 0.19:

a.loc[a.index[-1], 'a'] = 4.0

Just using iloc[-1, 'a'] won’t work as ‘a’ is not a location.

Answered By: brunostuyts
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.