Иметь уникальное значение индекса в фрейме данных Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я хотел бы иметь уникальное значение индекса вместо того, чтобы повторять одно и то же много раз.

Пример: у меня есть этот фрейм данных:

 test = pd.DataFrame({'id': ['a','a','a','a','b'],
                     'col_1': [1,2,3,4,5],
                     'col_2': [6,7,8,9,10]
                     })

  id  col_1  col_2
0  a  1      6    
1  a  2      7    
2  a  3      8    
3  a  4      9    
4  b  5      10  
  

И чего я хочу добиться, так это иметь столбец id в качестве индекса, а не повторяться. Я пробовал это, но, как вы можете видеть, индекс повторяется в каждой строке:

 test.set_index('id')

    col_1  col_2
id              
a   1      6    
a   2      7    
a   3      8    
a   4      9    
b   5      10  
  

И чего я хотел бы достичь, это (индекс ‘a’ для всей группы из 4 значений и т.д.):

     col_1  col_2
id              
a   1      6    
    2      7    
    3      8    
    4      9    
b   5      10  
  

Есть идеи, как это сделать?
Заранее спасибо.

Ответ №1:

Вы можете установить id столбец в качестве индекса. Чтобы избежать дублирования записей индекса, также установите индекс в качестве второго уровня результирующего мультииндекса.

 test.set_index(['id', test.index])

# Out:
      col_1  col_2
id                
a  0      1      6
   1      2      7
   2      3      8
   3      4      9
b  4      5     10
  

Если вы действительно не хотите иметь уровень индекса без дублирования, просто установите id в качестве индекса. Но имейте в виду, что в этом случае отображаемый формат pandas будет включать дубликаты:

 test.set_index('id')
# Out: 
    col_1  col_2
id              
a       1      6
a       2      7
a       3      8
a       4      9
b       5     10
  

Также test.set_index('id').index.duplicated().any() приведет True к типичным неоптимальным последствиям для индексов, содержащих дубликаты.

Ответ №2:

Если хотите заменить дублированные значения на '' для отображения, но лучше дублировать значения индекса, если потребуется более поздняя обработка:

 df = test.set_index('id')

df1 = df.set_index(df.index.where(~df.index.duplicated(), ''))
print (df1)
    col_1  col_2
id              
a       1      6
        2      7
        3      8
        4      9
b       5     10