Pandas 从中列中的类别创建列

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和日期中的数据级别创建列。对于每个客户ID,我希望他们在每个M

我有一个数据框,我想在其中根据该列的数据级别创建列。比如说,

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和日期中的数据级别创建列。对于每个客户ID,我希望他们在每个MCC和日期级别进行的交易金额和频率合并

以下是所需的输出:


因为最终数据帧中列的顺序应该很重要,所以将列
日期
转换为,然后创建
多索引
,列
交易金额
频率
也转换为顺序

然后在列中按第二级的
多索引
重新整形并排序

最后使用
f-string
s展平列表理解中的值,对于索引中的列:

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  

因为最终数据帧中列的顺序应该很重要,所以将列
date
转换为,然后创建
multi-index
by,并将列
TRANS\u AMT
Frequency
转换为ordered

然后在列中按第二级的
多索引
重新整形并排序

最后使用
f-string
s展平列表理解中的值,对于索引中的列:

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