преобразование столбцов в строки с помощью функции reset_index в пандах - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь распаковать столбцы фрейма данных pandas, который был создан с помощью объединения по столбцам идентификаторов.

df выглядит как показано ниже, имена столбцов как левой, так и правой таблиц похожи (Не уверен, стоит ли мне просто переименовывать их, и это решило бы проблему

id  county cat brand month country cat brand month
1    GB    x1   xx    12    GB      x2  x1    08
2    GB    x2   xx1   12    GB      x2  x1    09 

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

, например, дляid = 1

id  county cat brand month 
1    GB    x1   xx    12   
1    GB    x2   x1    08 

Любой более простой способ сделать это, я попробовал следующее, однако, это не работает

  1. Создать новый вызов столбца row_index_number

    df ['row_number'] = df.reset_index (). Index

  2. Добавил и отсортировал по номеру строки

    new = df [['id', 'county', 'cat', 'brand', 'month', 'row_number']]

    old = df [['id', 'county', 'cat', 'brand',' month ',' row_number ']]

    full = new.append (old)

    full = full.sort_values ​​(by = [' row_number '])

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

На шаге 2 преобразования переименование столбцов до того, как произойдет объединение, решает проблему

Сделал добавление и отсортировал по номеру строки

new = df[['id','county','cat','brand','month','row_number']]

old = df[['id','county_new','cat_new','brand_new','month_new','row_number']]

full = new.append(old)

full = full.sort_values(by = ['row_number'])
0 голосов
/ 27 ноября 2018

Вы можете использовать cumcount для подсчета дублированных имен столбцов и создать MultiIndex, назначив вложенные списки:

df = df.set_index('id') 

s = df.columns.to_series()
df.columns = [s.groupby(s).cumcount(), s]
print (df)
         0                       1                
   country cat brand month country cat brand month
id                                                
1       GB  x1    xx    12      GB  x2    x1     8
2       GB  x2   xx1    12      GB  x2    x1     9

print (df.columns)
MultiIndex(levels=[[0, 1], ['brand', 'cat', 'country', 'month']],
           labels=[[0, 0, 0, 0, 1, 1, 1, 1], [2, 1, 0, 3, 2, 1, 0, 3]])

И затем вызвать stack:

df1 = df.stack(0)
print (df1)
     brand cat country  month
id                           
1  0    xx  x1      GB     12
   1    x1  x2      GB      8
2  0   xx1  x2      GB     12
   1    x1  x2      GB      9

А затем выберите loc:

print (df1.loc[1])
  brand cat country  month
0    xx  x1      GB     12
1    x1  x2      GB      8

print (df1.loc[2])
  brand cat country  month
0   xx1  x2      GB     12
1    x1  x2      GB      9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...