Как рассчитать ежедневную разницу между пользователями и изменить фрейм данных pandas?

#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 не включено.
  • 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