pandas速成笔记(3)-join/groupby/sort/行列转换
接上篇继续 ,这回看下一些常用的操作:
一、join 联表查询
有数据库开发经验的同学,一定对sql中的join ... on 联表查询不陌生,pandas也有类似操作
假设test.xlsx的sheet1, sheet2中分别有下面的数据(相当于2张表)


现在要以ID做为作为Key,将二张表join起来,可以这样写:
import pandas as pd
pd1 = pd.read_excel("./data/test.xlsx", sheet_name="sheet1", index_col="ID")
pd2 = pd.read_excel("./data/test.xlsx", sheet_name="sheet2", index_col="ID")
print("-----pd1--------")
print(pd1)
print("\n-----pd2--------")
print(pd2)
print("\n------default-------")
pd3 = pd1.join(pd2)
print(pd3)
print("\n------left-------")
pd3 = pd1.join(pd2, how="left")
print(pd3)
print("\n------right-------")
pd3 = pd1.join(pd2, how="right")
print(pd3)
print("\n------inner-------")
pd3 = pd1.join(pd2, how="inner")
print(pd3)
print("\n------outer-------")
pd3 = pd1.join(pd2, how="outer")
print(pd3)
输出:
-----pd1--------
Name
ID
10 A
11 B
12 C -----pd2--------
Score
ID
11 90
12 80
13 76 ------default-------
Name Score
ID
10 A NaN
11 B 90.0
12 C 80.0 ------left-------
Name Score
ID
10 A NaN
11 B 90.0
12 C 80.0 ------right-------
Name Score
ID
11 B 90
12 C 80
13 NaN 76 ------inner-------
Name Score
ID
11 B 90
12 C 80 ------outer-------
Name Score
ID
10 A NaN
11 B 90.0
12 C 80.0
13 NaN 76.0
是不是跟sql几乎一模一样?如果2个表格中的Key,名称不一样,比如第2个表格长这样,第1列不叫ID,而是stutent_id

也不影响,只要在读取时设置了索引即可,默认join时就是用index列做为key关联
二、groupby分组统计
假设有一张表:

想按月汇总下Amount的总和,直接使用groupby("Month")
import pandas as pd
df = pd.read_excel("./data/test.xlsx")
print(df)
print("------------")
df_month = df.groupby("Month").sum()
print(df_month)
输出:
Category Amount Month
0 A 10 2021-09
1 B 20 2021-09
2 C 30 2021-09
3 A 15 2021-10
4 B 25 2021-10
5 C 35 2021-10
------------
Amount
Month
2021-09 60
2021-10 75
来个更复杂的,希望按Category看看,在本月当中该Category的Amount占"当月Amount总和"的占比,比如2021-09月,Amount总和为60,而9月之中,C类的Amount=30,即9月C类的Amount占9月总Amount的50%
import pandas as pd
df = pd.read_excel("./data/test.xlsx")
print(df)
print("------------")
df_month = df.groupby("Month").sum()
print(df_month)
print("------------")
# 插入2列
df.insert(2, 'MonthTotal', 0)
df.insert(3, 'MonthPercent', 0.0)
# 计算每个月,各Category的Amount占比
for idx2, data2 in df_month.iterrows():
for idx, data in df.iterrows():
if idx2 == data["Month"]:
data["MonthTotal"] = data2["Amount"]
data["MonthPercent"] = data["Amount"] / data2["Amount"]
df.iloc[idx] = pd.Series(data)
df["MonthPercent"] = df["MonthPercent"].apply(lambda x: format(x, '.2%'))
print(df)
输出:
Category Amount Month
0 A 10 2021-09
1 B 20 2021-09
2 C 30 2021-09
3 A 15 2021-10
4 B 25 2021-10
5 C 35 2021-10
------------
Amount
Month
2021-09 60
2021-10 75
------------
Category Amount MonthTotal MonthPercent Month
0 A 10 60 16.67% 2021-09
1 B 20 60 33.33% 2021-09
2 C 30 60 50.00% 2021-09
3 A 15 75 20.00% 2021-10
4 B 25 75 33.33% 2021-10
5 C 35 75 46.67% 2021-10
除了分组求和,当然还能求平均值,以及分组计算count
import pandas as pd
df = pd.read_excel("./data/test.xlsx")
print(df)
print("------------")
category_amount_avg = df.groupby("Category").mean()
print(category_amount_avg)
print("------------")
category_count = df.groupby("Month").count()
print(category_count)
输出:
Category Amount Month
0 A 10 2021-09
1 B 20 2021-09
2 C 30 2021-09
3 A 15 2021-10
4 B 25 2021-10
5 C 35 2021-10
------------
Amount
Category
A 12.5
B 22.5
C 32.5
------------
Category Amount
Month
2021-09 3 3
2021-10 3 3
三、sort排序

还是这张表,如果希望按Amount降序排列,可以这样:
import pandas as pd
df = pd.read_excel("./data/test.xlsx")
print("-----before sort------")
print(df)
print("-----after sort------")
df.sort_values("Amount", inplace=True, ascending=False)
print(df)
输出:
-----before sort------
Category Amount Month
0 A 10 2021-09
1 B 20 2021-09
2 C 30 2021-09
3 A 15 2021-10
4 B 25 2021-10
5 C 35 2021-10
-----after sort------
Category Amount Month
5 C 35 2021-10
2 C 30 2021-09
4 B 25 2021-10
1 B 20 2021-09
3 A 15 2021-10
0 A 10 2021-09
如果需要多个字段排序 ,比如:先按Month升序,再按Amount降序
print("-----after sort------")
df.sort_values(by=["Month", "Amount"], ascending=[True, False], inplace=True)
print(df)
输出:
-----after sort------
Category Amount Month
2 C 30 2021-09
1 B 20 2021-09
0 A 10 2021-09
5 C 35 2021-10
4 B 25 2021-10
3 A 15 2021-10
四、行列转换
pandas有一个内置的transpose()方法,可以直接实现:
import pandas as pd
df = pd.read_excel("./data/test.xlsx", index_col="Category")
print("------行转列(前)----------")
print(df)
print("------行转列(后)----------")
print(df.transpose())
输出:
------行转列(前)----------
Amount Month
Category
A 10 2021-09
B 20 2021-09
C 30 2021-09
A 15 2021-10
B 25 2021-10
C 35 2021-10
------行转列(后)----------
Category A B C A B C
Amount 10 20 30 15 25 35
Month 2021-09 2021-09 2021-09 2021-10 2021-10 2021-10
不过这个转换功能有点简单,如果要实现一些个性化的行列转换,比如希望达到下面的效果:
2021-09 2021-10
Category
A 10 15
B 20 25
C 30 35
就得自己写代码了,参考下面:
import pandas as pd
import matplotlib.pyplot as plt df = pd.read_excel("./data/test.xlsx") print("-------before-------")
df.set_index("Month", inplace=True)
print(df) print("-------after-------")
# 先对Month求distinct
months = df.index.unique()
rows = []
for month in months:
# 遍历df
for idx, data in df.iterrows():
if idx == month:
# 生成新DataFrame中的每一行
row = pd.Series({"Category": data.Category, month: data.Amount})
found = 0
for d in rows:
# 如果该分类的行存在,则填充缺的月份列
if d.Category == data.Category:
found = 1
d[month] = data.Amount # 如果该分类的行不存在,直接放入rows数列
if found == 0:
rows.append(row) # 构造新的DataFrame
df_output = pd.DataFrame(rows)
df_output.set_index("Category", inplace=True) print(df_output)
参考:
1、官网 pandas.DataFrame.join 文档
2、官网 pandas.DataFrame.groupby 文档
pandas速成笔记(3)-join/groupby/sort/行列转换的更多相关文章
- 【转】Pandas学习笔记(五)合并 concat
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- 【转】Pandas学习笔记(一)基本介绍
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join
关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理. 表的三种关联方式: nested loop:从A表抽一条记录,遍历B表查找匹配 ...
- Pandas 学习笔记
Pandas 学习笔记 pandas 由两部份组成,分别是 Series 和 DataFrame. Series 可以理解为"一维数组.列表.字典" DataFrame 可以理解为 ...
- Nested Loops,Hash Join 和 Sort Merge Join. 三种不同连接的不同:
原文:https://blog.csdn.net/tianlesoftware/article/details/5826546 Nested Loops,Hash Join 和 Sort Merge ...
- 三大表连接方式详解之Nested loop join和 Sort merge join
在早期版本,Oracle提供的是nested-loop join,两表连接就相当于二重循环,假定两表分别有m行和n行 如果内循环是全表扫描,时间复杂度就是O(m*n) 如果内循 ...
- 【转】Pandas学习笔记(七)plot画图
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- 【转】Pandas学习笔记(六)合并 merge
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- 【转】Pandas学习笔记(四)处理丢失值
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- 【转】Pandas学习笔记(三)修改&添加值
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
随机推荐
- BP算法完整推导 2.0 (上)
前面的笔记已经把 BP算法给推导了, 那4大公式, 核心就是 求偏导数的链式法则, 这篇, 再来跟着大佬来推一波, 目的是为了加深印象. 关于记忆这个话题, 心理学家,其实早已经给出了答案, 最好的记 ...
- 半小时快速入门Spring AI:使用腾讯云编程助手CodeBuddy 开发简易聊天程序
引言 随着人工智能(AI)技术的飞速发展,越来越多的开发者开始探索如何将AI集成到自己的应用中.人工智能正在迅速改变各行各业的工作方式,从自动化客服到智能推荐系统,AI的应用几乎无处不在.Spring ...
- np.where与pd.Series.where,pd.DataFrame.where的用法及区别
np.where与pd.Series.where及pd.DataFrame用法不一样,下面一一进行学习,总结: import numpy as np import pandas as pd help( ...
- WPF的Image控件图片不能显示出来
在Visual studio中,将图片的属性的"生成操作"从"无"改为"资源". 最终解决问题:
- ES查不到最近的数据解决方法
其实是因为索引的刷新策略导致的,不是实时刷新的. 下载开源的 ES 界面客户端ES King:https://github.com/Bronya0/ES-King 连接后,选择索引,选择flush索引 ...
- Spring 注解之@Primary注解
当一个接口有多个不同实现类时,使用注解@Autowired时会报 org.springframework.beans.factory.NoUniqueBeanDefinitionException ...
- Hoic对网站的测试使用
禁止使用该项技术攻击一切未经允许的公网网站,违者将受到法律制裁. 下载地址:https://wwl.lanzout.com/iiJa11zsqljg 下载完成后解压,并打开. 打开 \(hoic2.1 ...
- 超实用!10 个 Excel 数据验证技巧,轻松解决数据录入难题
[Excel基础系列之十二] 嗨,宝子们,我是社会牛马"表哥"--EETools. 在数据管理与日常办公中,Excel 数据验证如同一位 "数据质检员",从源头 ...
- ThreadLocal详解:线程私有变量的正确使用姿势
ThreadLocal详解:线程私有变量的正确使用姿势 在多线程编程中,如何让每个线程都拥有自己独立的变量副本?ThreadLocal就像给每个线程分配了一个专属保险箱,解决了线程间数据冲突的问题.本 ...
- 长亭雷池WAF(safeline)社区版安装教程
雷池WAF的技术文档,并不包含 Docker 和 Docker Compose V2 安装文档,更新记录一下,共同学习,共同进步 配置需求 操作系统:Linux 指令架构:x86_64 软件依赖:Do ...