Установить DataFrame.Index.values - PullRequest
       7

Установить DataFrame.Index.values

1 голос
/ 02 августа 2020

Я отвечал question в StackOverflow, когда я столкнулся со следующей проблемой с 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

кажется, что мы можем изменить атрибут values ​​вне объекта df.index, но это не меняет индекс. Неужели это действительно так?

не следует ли удалять .setter из свойства, если это не меняет индекс?

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Index.values.html

1 Ответ

2 голосов
/ 02 августа 2020

Для index replace у нас есть функция rename, также она не поддерживает присваивание из своих значений

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

Проблема здесь для RangeIndex

    if isinstance(data, RangeIndex):
        return RangeIndex(start=data, copy=copy, dtype=dtype, name=name)

Если мы изменим индекс диапазона на другой тип, как показано ниже, он будет работать

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...