Установите для индекса каждой второй строки одно новое значение - PullRequest
0 голосов
/ 02 августа 2020

Каков простой и прямой способ установить индекс каждой второй строки моего фрейма данных, скажем, «»? Метод, который я использовал, df.loc[1::2, 'index'] = '' раньше работал, но больше не работает. Я использую Pandas версию 1.1.0.

Теперь выдает следующую ошибку:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()                                                                                  
> lib/python3.6/site-packages/pandas/core/indexes/multi.py(1902)__getitem__()      

Вот моя тестовая установка:

#!/usr/bin/python3
import pandas as pd
import numpy as np
df=  pd.DataFrame(np.random.random(10), range(10), columns=['foo'])
df.index.name='bar'

, которая дает :

       foo
bar          
0    0.818489
1    0.525593
2    0.741739
3    0.250103
4    0.304080
5    0.206198
6    0.982070
7    0.476621
8    0.053609
9    0.726157

но следующее ничего не делает:

df.loc[1::2].index= ['']*len(df.loc[1::2].index)

т.е. результат по-прежнему

          foo
bar          
0    0.818489
1    0.525593
2    0.741739
3    0.250103
4    0.304080
5    0.206198
6    0.982070
7    0.476621
8    0.053609
9    0.726157

Почему это не работает?

Точно так же не работает:

df.index = df.index.to_numpy()
df.loc[1::2].index= ['']*len(df.loc[1::2].index)

Почему бы и нет?

(Усилия мотивированы тем, что выглядит для меня индекс - это не просто последовательность целых чисел (как раньше?)

df.index                                                                                                                              
Out[]: RangeIndex(start=0, stop=10, step=1, name='bar')

)

Это тоже не работает: df.loc[1::2,'bar']= ''.

Следующее работает (в Pandas 1.0.4, но не в 1.1.0), но оно включает перемещение индекса в столбец. Конечно, в этом нет необходимости?

df.reset_index(inplace=True)
df.loc[1::2,'bar']= ''
df.set_index('bar', inplace=True)

который дает мне то, что я хочу, а именно:

          foo
bar          
0    0.653306
     0.866628
2    0.356007
     0.393833
4    0.770817
     0.131656
6    0.314990
     0.419762
8    0.944348
     0.454487

Я ищу чистый, ясный и продуманный способ выполнить это простая модификация сопоставления значений индекса путем непосредственного воздействия на индекс.

(nb заголовок этого вопроса не идеален. Я не хочу использовать iloc; я хочу обратиться к индексам определенных строк все на одно и то же значение. Возможно, проблема несколько более общая).

1 Ответ

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

В одну сторону,

df = df.set_axis(pd.Index([index if i not in range(1, df.shape[0], 2) else '' 
                           for i, index in enumerate(df.index)], 
                          name=df.index.name))
print(df)

Выход

          foo
bar          
0    0.302340
     0.744609
2    0.489255
     0.542356
4    0.072797
     0.810690
6    0.738350
     0.939177
8    0.827072
     0.751731

Мы также можем использовать DataFrame.Index.values, но we need remove RangeIndex. Итак, самый чистый способ - DataFrame.rename

df = df.rename(index=dict.fromkeys(df.index[1::2],''))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...