#python #pandas #date #dataset #transpose
#python #pandas #Дата #набор данных #транспонировать
Вопрос:
Я работаю с фреймом данных Pandas на Python, в настоящее время у меня есть следующая схема:
>>> import pandas as pd
>>> d = {'date': ['15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep'],
... 'user': ['A','A','A','A','B','B','B','B','C','C','C','C'],
... 'sales': [5,8,6,7,9,12,11,11,11,15,8,6]}
>>> df = pd.DataFrame(data=d)
>>> df
date user sales
0 15-Sep A 5
1 16-Sep A 8
2 17-Sep A 6
3 18-Sep A 7
4 15-Sep B 9
5 16-Sep B 12
6 17-Sep B 11
7 18-Sep B 11
8 15-Sep C 11
9 16-Sep C 15
10 17-Sep C 8
11 18-Sep C 6
И хотел бы преобразовать (транспонировать?), Чтобы получить ежедневную разницу для каждого пользователя со ссылкой на последний день, следуя приведенному выше примеру, хотел бы получить это:
>>> d = {'user': ['A','B','C'],
... '16-Sep': [3,3,4],
... '17-Sep': [-2,-1,-7],
... '18-Sep': [1,0,-2]}
>>> df = pd.DataFrame(data=d)
>>> df
user 16-Sep 17-Sep 18-Sep
0 A 3 -2 1
1 B 3 -1 0
2 C 4 -7 -2
Эта таблица целей означает, что пользователь A продал -2 товара 17 сентября по сравнению с 16 сентября.
Каков наилучший способ сделать это? Любой пример того, как я мог бы это сделать? Я не смог найти подобную проблему.
Ответ №1:
.sort_values
в dataframe с помощьюuser
иdate
.groupby('user', as_index=False)
и совокупная разница.- A
TypeError: rename() got an unexpected keyword argument 'columns'
произойдет, еслиas_index=False
не включено.
- A
df.join
с.groupby
результатом..pivot
фрейм данных и ..dropna
import pandas as pd
# setup test dataframe
d = {'date': ['15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep'], 'user': ['A','A','A','A','B','B','B','B','C','C','C','C'], 'sales': [5,8,6,7,9,12,11,11,11,15,8,6]}
df = pd.DataFrame(data=d)
# groupby and join to df
dfg = df.sort_values(['user', 'date']).join(df.groupby('user', as_index=False)['sales'].diff().rename(columns={'sales': 'sales_diff'}))
# pivot the dataframe into the correct shape
dfp = dfg.pivot(columns='date', index='user', values='sales_diff').reset_index().dropna(axis=1)
# remove the name of the columns (e.g. date)
dfp.columns.name = None
# display(dfp)
user 16-Sep 17-Sep 18-Sep
0 A 3.0 -2.0 1.0
1 B 3.0 -1.0 0.0
2 C 4.0 -7.0 -2.0
Комментарии:
1. .rename(columns={‘sales’: ‘sales_diff’} выдает мне следующую ошибку: TypeError: rename() получил неожиданный аргумент ключевого слова ‘columns’ …. В качестве альтернативы я нарушил ваши данные шаги, чтобы избежать переименования этого столбца, мой рабочий ответ ниже.
2. @ssalgado какую версию pandas вы используете?
3. @ssalgado Я думаю, ты забыл добавить
as_index=False
в groupby. Если вы забудете об этом, если приведет кTypeError: rename() got an unexpected keyword argument 'columns'
Ответ №2:
Следуя правильному ответу Трентона, я получаю сообщение об ошибке с функцией .rename(), поэтому я добавил дополнительный шаг для преодоления этого.
Следующий код работает для меня:
import pandas as pd
d = {'date': ['15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep'],
'user': ['A','A','A','A','B','B','B','B','C','C','C','C'],
'sales': [5,8,6,7,9,12,11,11,11,15,8,6]}
df = pd.DataFrame(data=d)
#print("Original datasetn",df,"n")
# Sort values on user and date (to obtain proper differences)
df = df.sort_values(['user', 'date'])
# Add column sales_diff that groups by user, ad .diff() in sales
df['sales_diff'] = df.groupby(['user'])['sales'].diff()
#print("Added difference sales columnn",df,"n")
#Pivot table on user and sales_diff
dfp = df.pivot(columns='date', index='user', values='sales_diff').reset_index().dropna(axis=1)
#print("Pivot dataset on usern",dfp,"n")
# Remove the name of the columns (e.g. date)
dfp.columns.name = None
#print("Goal dataset obtainedn")
print(dfp)
user 16-Sep 17-Sep 18-Sep
0 A 3.0 -2.0 1.0
1 B 3.0 -1.0 0.0
2 C 4.0 -7.0 -2.0