我正在研究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
现在我的目标是汇总Quantity
上StockCode
项目{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
那么无论UnitPrice
和InvoiceNo
怎样,我如何操纵数据以便在一行上显示233的数量?
像这样吗?
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
上的销售分组,我也很感兴趣?
提前谢谢!
答案 0 :(得分:1)
如果只希望每列InvoiceDate
和StockCode
仅排第一行,我相信需要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