Создать мультииндекс из существующего фрейма данных


person puifais    schedule 08.06.2017    source источник
comment
Для целей обработки обе таблицы одинаковы. Но для отображения я предлагаю вам обратиться к: stackoverflow.com/a/25127764/2306662   -  person nikpod    schedule 08.06.2017
comment
Но я подумал, что мне нужен мультииндекс, если, скажем, я хочу построить общий объем продаж (всей учетной записи) по сравнению с датами?   -  person puifais    schedule 08.06.2017
comment
@puifais, почему вы не можете построить второй кадр данных, который вы собрали?   -  person Andrew L    schedule 08.06.2017


Ответы (5)


В этом случае вы можете просто использовать groupby, который автоматически создаст мультииндекс при суммировании продаж по запрошенным столбцам.

df.groupby(['user_id', 'account_num', 'dates']).sales.sum().to_frame()

Вы также должны быть в состоянии просто сделать это:

df.set_index(['user_id', 'account_num', 'dates'])

Хотя вы, вероятно, хотите избежать дублирования (например, двух или более строк с одинаковыми значениями user_id, account_num и date, но разными цифрами продаж), суммируя их, поэтому я рекомендовал использовать groupby.

Если вам нужен мультииндекс, вы можете просто получить доступ через new_df.index, где new_df — это новый фрейм данных, созданный в результате любой из двух вышеперечисленных операций.

И user_id будет уровнем 0, а account_num будет уровнем 1.

person Alexander    schedule 08.06.2017
comment
Таким образом, это означает группировку по user_id, account_num и датам и извлечению данных о продажах. если данные о продажах имеют одинаковые user_id, account_num и даты, то суммируйте их. это правильно? - person puifais; 09.06.2017
comment
Вроде... Это означает, что вы собираете данные о продажах через sum. Если бы столбец не был числовым, вы не смогли бы его суммировать. Вам нужно будет использовать что-то вроде first, last или unique с лямбда-функцией. - person Alexander; 10.06.2017
comment
Что делать, если у меня больше столбцов, кроме продаж? - person Shravya Boggarapu; 20.03.2020

Для разъяснения будущих пользователей я хотел бы добавить следующее:

Как сказал Александр,

df.set_index(['user_id', 'account_num', 'dates'])

с возможным inplace=True выполняет свою работу.

type(df) дает

pandas.core.frame.DataFrame

тогда как type(df.index) действительно ожидаемый

pandas.core.indexes.multi.MultiIndex
person Eulenfuchswiesel    schedule 17.07.2019

Используйте pd.MultiIndex.from_arrays

lvl0 = currentDataFrame.user_id.values
lvl1 = currentDataFrame.account_num.values

midx = pd.MultiIndex.from_arrays([lvl0, lvl1], names=['level 0', 'level 1'])
person piRSquared    schedule 08.06.2017

Есть два способа сделать это, хотя и не совсем так, как вы показали, но это работает.
Допустим, у вас есть следующий df:

      A   B    C      D
0   nil one    1    NaN
1   bar one    5    5.0
2   foo two    3    8.0
3   bar three  2    1.0
4   foo two    4    2.0
5   bar two    6    NaN

<сильный>1. Обходной путь 1:

df.set_index('A', append = True, drop = False).reorder_levels(order = [1,0]).sort_index()

Это вернет:

введите здесь описание изображения

<сильный>2. Обходной путь 2:

df.set_index(['A', 'B']).sort_index()

Это вернет:
введите здесь описание изображения

person user41855    schedule 23.03.2021

DataFrame, возвращаемый currentDataFrame.set_index(['user_id','account_num']), имеет индекс, установленный на ['user_id','account_num']

newmulti.index вернет объект MultiIndex.

person Community    schedule 08.06.2017
comment
Эм... я не понимаю. Итак, я делаю newmulti = currentDataFrame.set_index(['user_id','account_num']), а затем newmultiReal = newmulti.index? Не могли бы вы уточнить? Я совершенно новичок в пандах. - person puifais; 08.06.2017
comment
Какова ваша конечная цель? Если вам нужен исходный фрейм данных с мультииндексом, он у вас уже есть. - person ; 08.06.2017