数据排序:sort_values
python
# 降序:销售数量从多到少
df.sort_values('销售数量', ascending=False)
# 升序:单价从小到大(ascending=True 是默认值,可以不写)
df.sort_values('单价', ascending=True)
df.sort_values('单价')
# 多列排序:先按第一列,第一列的值相同时才按第二列
df.sort_values(['单价', '销售数量'], ascending=[True, False])NOTE
多列排序就像 Excel 的"多级排序":ascending 要传列表,和前面的列一一对应。上面这句的含义是"单价升序,单价相同再看销售数量降序"。
数据分组:groupby
分组操作就是把数据按照某个特征分成不同的组,然后对每个组分别进行统计计算。
python
df = pd.read_csv('data/sales.csv', nrows=20)
df['销售金额'] = df['单价'] * df['销售数量']
# 按"产品类别"分组,分别统计
df.groupby('产品类别')['订单号'].count() # 各组的订单数量
df.groupby('产品类别')['销售数量'].sum() # 各组的销售数量之和
df.groupby('产品类别')['销售金额'].sum() # 各组的销售金额之和
df.groupby('产品类别')['单价'].min() # 各组的最低单价
df.groupby('产品类别')['单价'].max() # 各组的最高单价
df.groupby('产品类别')['单价'].mean() # 各组的平均单价| 聚合方法 | 含义 |
|---|---|
count() | 统计数量 |
sum() | 求和 |
min() / max() | 最小值 / 最大值 |
mean() | 平均值 |
一次算多个指标:agg
python
# 对同一列做多种聚合
df.groupby('产品类别')['单价'].agg(['mean', 'max', 'min'])
# 不同列做不同聚合(推荐写法):字典的键是列名,值是聚合方式
df.groupby('产品类别').agg({
'销售数量': 'sum',
'销售金额': 'sum',
'单价': 'mean',
})TIP
"分组 + 聚合"是数据分析里出结论最快的一招:df.groupby(按什么分)[看哪一列].(算什么)。比如"各产品类别的销售金额合计",一行代码就出来了。
相关
练习题
一、知识回顾(读完直接做下面的实践题)
- 排序用
df.sort_values('列名', ascending=True);升序是True,降序是 False - 多列排序:
df.sort_values([列1, 列2], ascending=[True, False]),会先按第一列排,相同时才按第二列 - 分组用
df.groupby('列名'),作用是按某特征分成不同组后分别做统计计算 - 分组后统计数量用
count()、求和用sum()、平均值用mean()、最值用min()/max() - 一次算多个指标用
agg():df.groupby('产品类别')['单价'].agg(['mean', 'max', 'min']) - 不同列做不同聚合时,agg 里传字典:
{'销售数量': 'sum', '单价': 'mean'}
二、裸写题
数据:data/sales.csv
- 提示(先自己想,实在想不出再点开)
一级 · 思路:单列排序传列名,多列排序传列表 + ascending 列表 二级 · 方法:
sort_values('销售数量', ascending=False)/sort_values(['单价', '销售数量'], ascending=[True, False])三级 · 骨架:结果用.head(5)看前 5 行- 参考答案(做完再点开)
pythonimport pandas as pd df = pd.read_csv('data/sales.csv') df['销售金额'] = df['销售数量'] * df['单价'] # 2-1 print(df.sort_values('销售数量', ascending=False).head(5)) print(df.sort_values(['单价', '销售数量'], ascending=[True, False]).head(5))- 提示(先自己想,实在想不出再点开)
一级 · 思路:
df.groupby(按什么分)[看哪一列].(算什么)二级 · 方法:df.groupby('产品类别')['订单号'].count()/['销售数量'].sum()三级 · 骨架:先算出"销售金额"列再分组求和更有业务意义- 参考答案(做完再点开)
python# 2-2 print(df.groupby('产品类别')['订单号'].count()) print(df.groupby('产品类别')['销售数量'].sum())- 提示(先自己想,实在想不出再点开)
一级 · 思路:同一列要多个指标 → 用 agg 传列表 二级 · 方法:
df.groupby('产品类别')['单价'].agg(['mean', 'max', 'min'])三级 · 骨架:如果想再多一列"销售金额合计",改用 agg 传字典- 参考答案(做完再点开)
python# 2-3 print(df.groupby('产品类别')['单价'].agg(['mean', 'max', 'min'])) # 扩展:不同列不同聚合 print(df.groupby('产品类别').agg({'销售数量': 'sum', '销售金额': 'sum', '单价': 'mean'}))
