Группировать по кадрам со средним значением столбца - PullRequest
1 голос
/ 19 февраля 2020

Я действительно новичок в python .. всего за неделю go начал изучать его. У меня есть вопрос, и вы, ребята, можете помочь мне решить его. Заранее спасибо .. !!

У меня есть данные в следующем формате.

Date        Product Price   Discount
1/1/2020    A   17,490  30  
1/1/2020    B   34,990  21
1/1/2020    C   20,734  11  
1/2/2020    A   16,884  26  
1/2/2020    B   26,990  40  
1/2/2020    C   17,936  10  
1/3/2020    A   16,670  36  
1/3/2020    B   12,990  13  
1/3/2020    C   30,990  43  

Я хочу взять столбец среднего дисконта для каждой даты и просто иметь 2 столбца. работает ..: (

Date        AVG_Discount
1/1/2020    x %
1/2/2020    y %
1/3/2020    z %

Ниже я попытаюсь сделать ... Как я уже сказал, я новичок в Python, поэтому подход может быть неправильным. *

mean_col=df.groupby(df['time'])['discount'].mean()
df=df.set_index(['time'])
df['mean_col']=mean_col
df=df.reset_index()

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Очевидно, вы прочитали свой DataFrame из текстового файла, например, CSV, но с разделителем, отличным от запятой.

Выполните df.info(), и я предполагаю, что вы получили результат, подобный приведенному ниже:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 4 columns):
Date        9 non-null object
Product     9 non-null object
Price       9 non-null object
Discount    9 non-null int64
dtypes: int64(1), object(3)

Обратите внимание, что Дата , Продукт и Цена имеют столбцы объект (фактически, строка ) ). Это замечание особенно важно в случае столбца Цена , поскольку для вычисления означает исходный столбец должен иметь значение число (не строка).

Итак, сначала вы должны преобразовать столбцы Date и Price в соответствующие типы ( datetime и float ). Для этого выполните:

df.Date = pd.to_datetime(df.Date)
df.Price = df.Price.str.replace(',', '.').astype(float)

Запустите df.info() еще раз, и теперь результат должен быть:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 4 columns):
Date        9 non-null datetime64[ns]
Product     9 non-null object
Price       9 non-null float64
Discount    9 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(1), object(1)

И теперь вы можете вычислить среднюю скидку, выполнив:

df.groupby('Date').Discount.mean()

Для ваших данных я получил:

Date
2020-01-01    20.666667
2020-01-02    25.333333
2020-01-03    30.666667
Name: Discount, dtype: float64

Обратите внимание, что ваш пример кода содержит следующие ошибки:

  • Аргумент groupby является имя столбца (или список имен столбцов), поэтому:
    • df между скобками не требуется,
    • вместо time вы должны написать Date (у вас нет время столбец).
  • Ваш Скидка столбец записывается, начиная с прописной D .
0 голосов
/ 19 февраля 2020
  • df.groupby(df['time'])['discount'].mean() Уже возвращает серию с time в качестве индекса.
  • Все, что вам нужно сделать, это просто использовать reset_index функцию для этого.
grouped_df = df.groupby(df['time'])['discount'].mean().reset_index()
  • Как предложил Куанг Хоанг в комментариях. Вы также можете передать as_index=False в группу.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...