一堆乱七八糟的数据扔你脸上,比如一份几万行的Excel订单,或者一个服务器上G的访问日志,老板让你半小时内给他个报告:哪个商品卖得最好?哪个地区的下单量最高?哪个IP访问最频繁?你怎么办?头大不?别慌,这事儿,python怎么统计?简直是小菜一碟。
今天不跟你扯那些干巴巴的官方文档,我就以一个过来人的身份,跟你聊聊我是怎么从一个只会用for
循环的菜鸟,一步步玩转Python数据统计的。
最初的挣扎:字典和for
循环的“体力活”
刚开始,我也是个愣头青。拿到需求,第一反应就是最原始的办法。你可能会想,不就是数个数嘛,我用一个字典,一个for
循环,遍历一遍,遇到一个key就在它的value上加一,不就完事了?
思路没错,很朴素,很直接。比如,统计一个列表里每个水果出现的次数:
“`python
fruits = [‘apple’, ‘orange’, ‘apple’, ‘banana’, ‘orange’, ‘apple’]
fruit_counts = {}
for fruit in fruits:
if fruit not in fruit_counts:
fruit_counts[fruit] = 1
else:
fruit_counts[fruit] += 1
print(fruit_counts)
输出: {‘apple’: 3, ‘orange’: 2, ‘banana’: 1}
“`
能跑吗?能。解决问题了吗?解决了。但是,你看着这几行代码,不觉得有点笨拙吗?每次都得写个if-else
判断,数据量一大,这循环跑起来,慢得跟老牛拉车似的。这纯粹是体力活,一点都不“Pythonic”。
发现新大陆:collections.Counter
,懒人福音
然后,你发现了新大陆——collections
模块里的Counter
。我跟你讲,这玩意儿简直就是为统计词频、计数这类需求而生的神器。它本身就是个字典的子类,天生就带计数功能。
同样是上面那个水果列表,用Counter
怎么搞?
“`python
from collections import Counter
fruits = [‘apple’, ‘orange’, ‘apple’, ‘banana’, ‘orange’, ‘apple’]
fruit_counts = Counter(fruits)
print(fruit_counts)
输出: Counter({‘apple’: 3, ‘orange’: 2, ‘banana’: 1})
“`
看到没?一行代码!一行代码就搞定了!它不仅帮你数好了,还给你一个长得像字典的结果。更爽的是,它还有个.most_common()
方法,直接帮你排序。
“`python
找出最常见的两个水果
print(fruit_counts.most_common(2))
输出: [(‘apple’, 3), (‘orange’, 2)]
``
Counter`就是你的不二之选,它像一把瑞士军刀,小巧但极其锋利。
就这?对,就这。简单、高效、优雅。在你只需要对一个列表、一个字符串里的元素做简单频率统计时,
终极武器登场:pandas
,数据分析界的航母
但如果你要处理的,不只是一个简单的列表呢?如果你面对的是一个结构化的数据表,比如前面说的Excel订单,有商品名、有价格、有地区、有用户ID……这时候,Counter
就有点力不从心了。
轮到真正的大家伙出场了——pandas
。
pandas
,数据分析界的航母,没跑了。你要是搞数据,不认识pandas
,那基本等于白干。它把你的Excel、CSV文件直接读成一个叫DataFrame的东西,那感觉,就像把一盘散沙捏成了一块块规整的积木,想怎么拼就怎么拼。
解决“python怎么统计”这个问题,pandas
提供了核武器级别的支持。
1. 单列统计?value_counts()
一招鲜
还是那个问题:哪个商品卖得最好?假设你已经用pd.read_excel()
把订单表读进了一个叫df
的DataFrame里,里面有一列叫'商品名称'
。
“`python
假设df是你的DataFrame
… 读取数据的代码 …
统计’商品名称’这一列里每个值出现的次数
product_counts = df[‘商品名称’].value_counts()
print(product_counts)
“`
就这么简单!value_counts()
这个方法,一步到位,直接给你返回一个按数量降序排列好的Series(你可以把它看作是带索引的一列数据)。结果清清楚楚,哪个卖得多,哪个卖得少,一目了然。这不比你在Excel里用筛选、用数据透视表快得多?
2. 分组统计?groupby()
王者降临
现在,难度升级。老板问:每个地区的销售总额和平均订单价分别是多少?
这个问题,涉及到两个维度:地区(分组依据)和销售额(计算目标)。这就是pandas
的groupby()
大显身手的地方。groupby()
的精髓,四个字:分组-聚合。
想象一下,你有一堆不同颜色的珠子,groupby('颜色')
就像你伸出手,把相同颜色的珠子都归拢到一堆。然后,“聚合”就是你对每一堆珠子进行操作,比如数数(count
)、求和(sum
)、算平均值(mean
)。
“`python
假设df里有’地区’和’订单金额’两列
按’地区’分组,然后计算每个地区的’订单金额’的总和和平均值
regional_stats = df.groupby(‘地区’)[‘订单金额’].agg([‘sum’, ‘mean’])
print(regional_stats)
“`
这行代码的威力,你自己品。它会先按“地区”列(比如华北、华南、华东)把数据分成几大块,然后只针对“订单金额”这一列,分别计算每一块的总和(sum
)和平均值(mean
)。最后,给你一个非常漂亮的报表,索引是地区,列是总和和平均值。
这就是数据分析的魅力所在,你不再是盯着单个数字,而是在洞察结构和关系。
3. 全局概览?describe()
一览众山小
有时候,你甚至不需要提具体问题,你只是想对数据有个大概的了解。比如,订单金额的平均数、最大值、最小值、中位数是多少?
describe()
方法,一键生成所有数值列的描述性统计信息。
python
print(df['订单金额'].describe())
它会给你返回计数(count)、平均值(mean)、标准差(std)、最小值(min)、25%分位数、50%分位数(即中位数)、75%分位数和最大值(max)。瞬间,你对这批订单的消费水平就有了一个立体的认知。
总结一下,但不是终点
所以,python怎么统计?
- 小打小闹,处理个列表,统计个词频,用
collections.Counter
,又快又好。 - 正规作战,面对表格数据,想做深入分析,别犹豫,直接上
pandas
。value_counts()
解决单列频率,groupby()
解决多维分组聚合,describe()
给你全局视野。
工具是死的,思路是活的。从for
循环到Counter
,再到pandas
,这不仅仅是代码的进化,更是你数据思维的升级。你不再是一个被动的计数员,而是一个主动的探索者,用Python这把利剑,剖开数据的外壳,去发现里面真正有价值的宝藏。
下次再有人把数据扔你脸上,你就可以微微一笑,打开Jupyter Notebook,开始你的表演。
评论(0)