如何在Python中对相同的值进行分组并计算其频率?


10

刚开始使用Python分析的新手,请谨慎:-)我找不到该问题的答案-抱歉,如果它已经在其他地方以其他格式回答了。

我有一个零售商店的交易数据的数据集。变量及其说明如下:

  • section:商店的部分,str;
  • prod_name:产品名称,str;
  • 收据:发票编号,整数;
  • 出纳员,出纳员的编号,整数;
  • 成本:物料的成本,浮动;
  • 日期,格式为MM / DD / YY,为str;
  • 时间,格式为HH:MM:SS,为str;

收据对于单笔交易中购买的所有产品具有相同的价值,因此可用于确定单笔交易中购买的平均数量。

最好的方法是什么?我本质上是想使用groupby()按收据变量相同的出现来对收据变量进行分组,以便创建直方图。

在pandas DataFrame中处理数据。

编辑:

以下是一些带有标头的示例数据(prod_name实际上是一个十六进制数字):

 section,prod_name,receipt,cashier,cost,date,time 
 electronics,b46f23e7,102856,5,70.50,05/20/15,9:08:20 
 womenswear,74558d0d,102857,8,20.00,05/20/15,9:12:46 
 womenswear,031f36b7,102857,8,30.00,05/20/15,9:12:47 
 menswear,1d52cd9d,102858,3,65.00,05/20/15,9:08:20 

从该样本集中,我希望获得一个直方图,该直方图显示两次出现的收据102857(因为该人在一项交易中购买了两件物品)和一次出现的收据102856和102858。注意:我的数据集并不庞大,大约一百万行。


完成,添加了一些示例数据。
new_analyst '16

Answers:


15

从该样本集中,我希望得到一个收据直方图,该图显示两次出现的收据102857(因为该人在一次交易中购买了两件商品)和一次出现的收据102856和102858。

然后,您想要:

df.groupby('receipt')。receipt.count()

receipt
102856    1
102857    2
102858    1
Name: receipt, dtype: int64

由于结果不再是数据帧,我们如何对其进行过滤以仅显示计数大于1的值?
Nikhil VJ

1
您仍然可以做类似的事情s[s>1],其中s=df.groupby('receipt').receipt.count()
Emre

2

我正在整理一些有关数据处理的教程。也许我在github上的jupyter笔记本会有所帮助。我认为这是修改该行的关键:

df.groupby('male')['age'].mean()

成为:

df.groupby('reciept')['prod_name'].count()

要按多个变量分组,应该可以:

df.groupby(['reciept','date'])['reciept'].count()

感谢那。但是,有时会重复收据(日期也不同)。因此,当我们确实想知道交易的收据数量时,即使在不同的日期,我们也会汇总所有不同的收据出现次数,但是并没有唯一的交易ID变量。我认为收据不会在同一天重复-我们可以使用日期进行分组吗?df.groupby('reciept')['date'].count()给出的结果与df.groupby('reciept')['prod_name'].count()
new_analyst '16

将日期作为参数添加到groupby调用中。编辑我上面的答案,以多个变量分组。
瑞安

0

据我了解,您需要一张收据编号的直方图。您可以尝试这样的事情

import pandas as pd data = np.read_csv("your_file_path.csv") data.groupby(["receipt"])receipt.count().sort_values(ascending=False).head(20).plot.bar()

这将为您提供重复次数最多的帐单条形图(重复次数最多的20个条形图)更改head功能中的数字以获得或多或少。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.