Панды: Сумма и Совокупные значения столбца, основанные на трех других других значениях столбца - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю над набором данных Kaggle E-Commerce .Чтобы подготовить данные для нейронной сети для прогноза будущих продаж, мне нужно агрегировать количество продаж определенного продукта за каждый день.Мой код сейчас выглядит следующим образом ...

import pandas as pd

df = pd.read_csv('data_date.csv', encoding='cp1252')
df = df.drop(df.columns[[0,3,7,8]], axis=1)
print(df.head(5))

это выдает следующее ...

InvoiceNo StockCode  Quantity InvoiceDate  UnitPrice
0    536365    85123A         6  2010-12-01       2.55
1    536365     71053         6  2010-12-01       3.39
2    536365    84406B         8  2010-12-01       2.75
3    536365    84029G         6  2010-12-01       3.39
4    536365    84029E         6  2010-12-01       3.39

Теперь моя цель - агрегировать, например, Quantity из StockCodeПункт 71053 InvoideDate 2010-12-01.Но это всего лишь пример, мне нужен обзор, сколько позиций каждого StockCode было продано каждый день.

Я перепробовал множество операций groupy и нашел ответ на SO, который принеся довольно близок к желаемому выводу ...

df["Quantity"] = df.groupby(["InvoiceDate", "StockCode"])["Quantity"].transform(sum)
print(df.head(5))

это дает мне следующий вывод ...

InvoiceNo StockCode  Quantity InvoiceDate  UnitPrice
0    536365    85123A       454  2010-12-01       2.55
1    536365     71053        33  2010-12-01       3.39
2    536365    84406B        40  2010-12-01       2.75
3    536365    84029G        59  2010-12-01       3.39
4    536365    84029E       551  2010-12-01       3.39

уже выглядит хорошо, но когда я сделал тест с определеннымStockCode, он по-прежнему помещает один и тот же Quantity в разные строки и не объединяет его.См. Пример ниже ...

print(df.loc[df['StockCode']=='22632'])

output ...

InvoiceNo StockCode  Quantity InvoiceDate  UnitPrice
8         536366     22632       233  2010-12-01       1.85
47        536372     22632       233  2010-12-01       1.85
84        536377     22632       233  2010-12-01       1.85
257       536394     22632       233  2010-12-01       1.85
304       536398     22632       233  2010-12-01       2.10
315       536399     22632       233  2010-12-01       1.85
433       536407     22632       233  2010-12-01       1.85
664       536415     22632       233  2010-12-01       2.10
704       536423     22632       233  2010-12-01       2.10
879       536477     22632       233  2010-12-01       2.10
952       536520     22632       233  2010-12-01       2.10
1029      536522     22632       233  2010-12-01       2.10
1066      536522     22632       233  2010-12-01       2.10
1260      536532     22632       233  2010-12-01       2.10
1399      536539     22632       233  2010-12-01       2.10
1441     C536543     22632       233  2010-12-01       2.10
1628      536544     22632       233  2010-12-01       4.21
2139      536561     22632       233  2010-12-01       2.10
2183      536567     22632       233  2010-12-01       2.10
2776      536592     22632       233  2010-12-01       4.21
3130      536601     22632       169  2010-12-02       1.85

Итак, как мне манипулировать данными, чтобы они отображали количество 233 в одной строке, независимо от UnitPrice и InvoiceNo?

как это?

InvoiceNo StockCode  Quantity InvoiceDate  UnitPrice
    8         536366     22632       233  2010-12-01       1.85
    3130      536601     22632       169  2010-12-02       1.85

также мне было бы интересно, если есть способ сгруппировать Продажи по StockCode и InvoiceDate И поразные UnitPrices?

Заранее спасибо!

1 Ответ

0 голосов
/ 18 сентября 2018

Я считаю, что нужно drop_duplicates, если нужны первые строки только для столбцов InvoiceDate и StockCode:

df["Quantity"] = df.groupby(["InvoiceDate", "StockCode"])["Quantity"].transform(sum)
df11 = df.drop_duplicates(['InvoiceDate','StockCode'])
print (df11)
     InvoiceNo  StockCode  Quantity InvoiceDate  UnitPrice
8       536366      22632       233  2010-12-01       1.85
3130    536601      22632       169  2010-12-02       1.85

То же решение с агрегацией - указать агрегатную функцию first:

df11 = (df.groupby(["InvoiceDate", "StockCode"], as_index=False)
         .agg({'Quantity': 'sum', 'UnitPrice':'first', 'InvoiceNo': 'first'})
         .reindex(columns=df.columns))
print (df11)
  InvoiceNo  StockCode  Quantity InvoiceDate  UnitPrice
0    536366      22632      4660  2010-12-01       1.85
1    536601      22632       169  2010-12-02       1.85

Старый ответ:

df1 = df.groupby(["InvoiceDate", "StockCode"], as_index=False)["Quantity"].sum()
print (df1)
  InvoiceDate StockCode  Quantity
0  2010-12-01     71053         6
1  2010-12-01    84029E         6
2  2010-12-01    84029G         6
3  2010-12-01    84406B         8
4  2010-12-01    85123A         6

Но если нужно, чтобы все столбцы в выходных данных были необходимы, добавьте их в groupby или укажите агрегирующие функции для каждого столбца:

df2 = (df.groupby(["InvoiceNo","InvoiceDate", "StockCode"], as_index=False)
               ['Quantity','UnitPrice'].sum())
print (df2)
   InvoiceNo InvoiceDate StockCode  Quantity  UnitPrice
0     536365  2010-12-01     71053         6       3.39
1     536365  2010-12-01    84029E         6       3.39
2     536365  2010-12-01    84029G         6       3.39
3     536365  2010-12-01    84406B         8       2.75
4     536365  2010-12-01    85123A         6       2.55

Или указать для каждой статистической функции столбца, например:

df2 = (df.groupby(["InvoiceDate", "StockCode"], as_index=False)
         .agg({'Quantity': 'sum', 'UnitPrice':'mean', 'InvoiceNo': 'first'}))
print (df2)
  InvoiceDate StockCode  Quantity  UnitPrice  InvoiceNo
0  2010-12-01     71053         6       3.39     536365
1  2010-12-01    84029E         6       3.39     536365
2  2010-12-01    84029G         6       3.39     536365
3  2010-12-01    84406B         8       2.75     536365
4  2010-12-01    85123A         6       2.55     536365
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...