Создание столбца из категорий в столбце в pandas

#pandas

#pandas

Вопрос:

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

 Cust_ID  MCC  Date TRANS_AMT Frequency
1       1750  Jan    6633        1
1       1799  Jan    5584        1
2       3001  Mar    405         2
2       3174  Oct    1219        1
 

Я хочу создавать столбцы на основе уровней данных, которые у меня есть в столбце MCC и Date. Для каждого Cust_ID я хочу, чтобы TRANS_AMT и частота, которые они выполняли на каждом уровне MCC и даты, были объединены.

Ниже приведен необходимый вывод:

Пример вывода

Ответ №1:

Поскольку порядок столбцов в конечном фрейме данных должен быть важным, преобразуйте столбец date в упорядоченный категориальный, затем создайте MultiIndex DataFrame.set_index столбцы по и TRANS_AMT и Frequency также преобразуйте в упорядоченный CategoricalIndex .

Затем измените форму по DataFrame.unstack и отсортируйте по второму уровню MultiIndex в столбцах по DataFrame.sort_index .

Последнее выравнивание значений в понимании списка с f-string помощью s и DataFrame.reset_index для столбца из индекса:

 cats = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 
        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

df['Date'] = pd.Categorical(df['Date'], categories=cats, ordered=True)
df1 = df.set_index(['Cust_ID','MCC','Date'])
df1.columns = pd.CategoricalIndex(df1.columns, 
                                  categories=['TRANS_AMT','Frequency'], 
                                  ordered=True)

df1 = df1.unstack(level=[1,2], fill_value=0).sort_index(axis=1, level=1)

df1.columns = [f'{a}_{b}_{c}' for a, b, c in df1.columns]
df1 = df1.reset_index()
print (df1)
   Cust_ID  TRANS_AMT_1750_Jan  Frequency_1750_Jan  TRANS_AMT_1799_Jan  
0        1                6633                   1                5584   
1        2                   0                   0                   0   

   Frequency_1799_Jan  TRANS_AMT_3001_Mar  Frequency_3001_Mar  
0                   1                   0                   0   
1                   0                 405                   2   

   TRANS_AMT_3174_Oct  Frequency_3174_Oct  
0                   0                   0  
1                1219                   1  
 

Если заказ не важен, удалите преобразование в категориальные категории:

 df1 = (df.set_index(['Cust_ID','MCC','Date'])
         .unstack(level=[1,2], fill_value=0)
         .sort_index(axis=1, level=1))
df1.columns = [f'{a}_{b}_{c}' for a, b, c in df1.columns]
df1 = df1.reset_index()
print (df1)
   Cust_ID  Frequency_1750_Jan  TRANS_AMT_1750_Jan  Frequency_1799_Jan  
0        1                   1                6633                   1   
1        2                   0                   0                   0   

   TRANS_AMT_1799_Jan  Frequency_3001_Mar  TRANS_AMT_3001_Mar  
0                5584                   0                   0   
1                   0                   2                 405   

   Frequency_3174_Oct  TRANS_AMT_3174_Oct  
0                   0                   0  
1                   1                1219