Reputation: 30920
I was answering a question
on StackOverflow, when I encountered the following problem with pandas 1.0.1
import pandas as pd
import numpy as np
df= pd.DataFrame(np.random.random(10), range(10), columns=['foo'])
print(df)
print('\nInitial Index\n')
print(df.index)
print('\nSet DataFrame.index.values\n')
df.index.values[1::2] = 0
print(df.index.values)
print('\nBut df.index does not change\n')
print(df.index)
print(df)
print('\nSetting Index : df.index = df.index.values \n')
df.index = df.index.values
print('\nIndex changed\n')
print(df)
foo
0 0.213399
1 0.369334
2 0.924745
3 0.778120
4 0.594977
5 0.916565
6 0.603158
7 0.703187
8 0.462739
9 0.728851
Initial Index
RangeIndex(start=0, stop=10, step=1)
Set DataFrame.index.values
[0 0 2 0 4 0 6 0 8 0]
But df.index does not change
RangeIndex(start=0, stop=10, step=1)
foo
0 0.213399
1 0.369334
2 0.924745
3 0.778120
4 0.594977
5 0.916565
6 0.603158
7 0.703187
8 0.462739
9 0.728851
Setting Index : df.index = df.index.values
Index changed
foo
0 0.213399
0 0.369334
2 0.924745
0 0.778120
4 0.594977
0 0.916565
6 0.603158
0 0.703187
8 0.462739
0 0.728851
it seems that we can change the values attribute from outside the df.index object but this does not change the index. Is this really thought like this?
shouldn't the .setter
be removed from the property if this doesn't really change the index?
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Index.values.html
Upvotes: 1
Views: 235
Reputation: 323226
For index
replace we have the rename
function for it, also it dose not support assignment from its values
df.rename(index=dict.fromkeys(df.index[1::2],0))
Out[162]:
foo
0 0.166692
0 0.889263
2 0.509025
0 0.688095
4 0.995862
0 0.258366
6 0.080054
0 0.406233
8 0.296096
0 0.680760
The problem here is for RangeIndex
if isinstance(data, RangeIndex): return RangeIndex(start=data, copy=copy, dtype=dtype, name=name)
If we change the range index to other type like below, it will work
df.index=[100,0,1,2,3,4,5,6,7,8]
df.index.values[1::2] = 0
df
Out[177]:
foo
100 0.166692
0 0.889263
1 0.509025
0 0.688095
3 0.995862
0 0.258366
5 0.080054
0 0.406233
7 0.296096
0 0.680760
Upvotes: 2