#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