大熊猫:基于其他三个不同列值的列值总和

时间:2018-09-18 10:07:32

标签: python pandas

我正在研究Kaggle E-Commerce-Dataset。为了准备用于未来销售预测的神经网络数据,我需要每天汇总特定产品销售的数量。我的代码现在看起来如下...

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

现在我的目标是汇总QuantityStockCode项目{71053}的InvoideDate。但这只是一个例子,我需要的是概览,每天售出每个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'])

输出...

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

那么无论UnitPriceInvoiceNo怎样,我如何操纵数据以便在一行上显示233的数量?

像这样吗?

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

如果有一种方法可以将每个StockCodeInvoiceDate的销售以及不同UnitPrices上的销售分组,我也很感兴趣?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果只希望每列InvoiceDateStockCode仅排第一行,我相信需要drop_duplicates

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