Как изменить индекс внешнего уровня в мультииндекс в pandas данных? - PullRequest
1 голос
/ 12 марта 2020

У меня есть фрейм данных с многоуровневым индексом с 9 миллионами строк следующим образом. Я бы sh изменил индекс уровня 0, который в некоторых случаях не является уникальным, на числовой порядок, содержащий уникальные индексы. Вот пример ввода:

ORDER             NO         DATE
4200000303        1          2015-02-19
                  2          2015-02-19
                  3          2015-02-19
1200000303        1          2016-07-19
                  2          2016-07-19
                  3          2016-07-19
                  4          2016-07-19
1500000303        1          2017-08-19
                  2          2017-08-19
                  3          2017-08-19
                  4          2017-08-19
x8594345 rows

Требуемый вывод должен быть:

ORDER             NO         DATE
0                 1          2015-02-19
                  2          2015-02-19
                  3          2015-02-19
1                 1          2016-07-19
                  2          2016-07-19
                  3          2016-07-19
                  4          2016-07-19
2                 1          2017-08-19
                  2          2017-08-19
                  3          2017-08-19
                  4          2017-08-19
x8594345 rows

Я пробовал следующий код:

transactions.index = pd.MultiIndex.from_arrays(
    [list(range(0,transactions.shape[0])), transactions.groupby(level=0).cumcount()],
    names=['ORDER', 'NO'])

Но он возвращает плоский dataframe.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Используйте factorize только для первого уровня:

transactions.index = pd.MultiIndex.from_arrays(
                              [pd.factorize(transactions.index.get_level_values(0))[0],
                               transactions.index.get_level_values(1)],
                              names=['ORDER', 'NO'])

print (transactions)
ORDER  NO
0      1     2015-02-19
       2     2015-02-19
       3     2015-02-19
1      1     2016-07-19
       2     2016-07-19
       3     2016-07-19
       4     2016-07-19
2      1     2017-08-19
       2     2017-08-19
       3     2017-08-19
       4     2017-08-19
Name: A, dtype: object
0 голосов
/ 12 марта 2020

Возможно, есть лучший способ, но я бы сейчас go сказал:

(df.reset_index()
  .assign(ORDER=lambda x: x['ORDER'].factorize()[0])
  .set_index(['ORDER','NO'])
)
...