小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame
在家为国家做贡献太无聊,不如跟我一起学点 Python
人生苦短,我用 Python
前文传送门:
小白学 Python 数据分析(2):Pandas (一)概述
小白学 Python 数据分析(3):Pandas (二)数据结构 Series
引言
DataFrame 是由多种类型的列构成的二维标签数据结构。
简单理解是类似于 Excel 、 SQL 表的结构。
DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据:
- 一维 ndarray、列表、字典、Series 字典
- 二维 numpy.ndarray
- 结构多维数组或记录多维数组
- Series
- DataFrame
构建 DataFrame
同 Excel 一样, DataFrame 拥有行标签( index )和列标签( columns ),可以理解为 Excel 的行和列。
在构建 DataFrame 的时候,可以有选择的传递 index 和 columns 参数。
这样可以确保生成的 DataFrame 里包含索引或列。
注意: Python > = 3.6,且 Pandas > = 0.23,数据是字典,且未指定 columns 参数时,DataFrame 的列按字典的插入顺序排序。
Python < 3.6 或 Pandas < 0.23,且未指定 columns 参数时,DataFrame 的列按字典键的字母排序。
Series 字典或字典构建 DataFrame
先看一个简单的示例:
d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
结果如下:
one two
a 1.0 1.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0
在通过 Series 构建 DataFrame 的时候,生成的 index (索引)是每个 Series 索引的并集。
先把嵌套字典转换为 Series 。如果没有指定列, DataFrame 的列就是字典键的有序列表。
这里我们在字典中使用两个字符串 one
和 two
作为字典的 key ,在构造 DataFrame 时会自动的使用我们的字典的 key 作为自己的 columns (列)。
如果我们在构造 DataFrame 手动指定索引,那么将会使用我们自行指定的索引,示例如下:
df1 = pd.DataFrame(d, index=['d', 'b', 'a'])
print(df1)
结果如下:
one two
d NaN 4.0
b 2.0 2.0
a 1.0 1.0
如果我们同时指定 index 和 column ,那么 DataFrame 也将会使用我们指定的索引和列,如果我们指定的 index 或者 column 不存在,将会使用 NaN 进行默认值填充,示例如下:
df2 = pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
print(df2)
结果如下:
two three
d 4.0 NaN
b 2.0 NaN
a 1.0 NaN
注意: 这里有一点需要注意,指定列与数据字典一起传递时,传递的列会覆盖字典的键。
在使用 Series 构建 DataFrame 时, DataFrame 会自动继承 Series 的索引,如果没有指定列名,默认列名是输入 Series 的名称。
多维数组字典构建 DataFrame
首先,多维数组的长度必须相同。
如果传递了索引参数,index 的长度必须与数组一致。
如果没有传递索引参数,那么将会按照序列从 0 开始,自动生成,示例如下:
d1 = {'one': [1., 2., 3., 4.],
'two': [4., 3., 2., 1.]}
df3 = pd.DataFrame(d1)
print(df3)
df4 = pd.DataFrame(d1, index=['a', 'b', 'c', 'd'])
print(df4)
结果如下:
one two
0 1.0 4.0
1 2.0 3.0
2 3.0 2.0
3 4.0 1.0
one two
a 1.0 4.0
b 2.0 3.0
c 3.0 2.0
d 4.0 1.0
列表字典构建 DataFrame
d2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df5 = pd.DataFrame(d2)
print(df5)
df6 = pd.DataFrame(d2, index=['first', 'second'], columns=['a', 'b'])
print(df6)
结果如下:
a b c
0 1 2 NaN
1 5 10 20.0
a b
first 1 2
second 5 10
元组字典构建 DataFrame
元组字典可以自动创建多层索引 DataFrame。
d3 = ({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}})
df7 = pd.DataFrame(d3)
print(df7)
结果如下:
a b
b a c a b
A B 1.0 4.0 5.0 8.0 10.0
C 2.0 3.0 6.0 7.0 NaN
D NaN NaN NaN NaN 9.0
提取、添加、删除
创建好了 DataFrame 以后,我们自然是希望可以动态的操作它,那么标准的 CRUD 操作必不可少。
获取数据示例如下,这里我们使用 df4 做演示:
提取
# 获取数据
print(df4)
# 按列获取
print(df4['one'])
# 按行获取
print(df4.loc['a'])
print(df4.iloc[0])
df4['three'] = df4['one'] * df4['two']
df4['flag'] = df4['one'] > 2
print(df4)
结果如下:
one two
a 1.0 4.0
b 2.0 3.0
c 3.0 2.0
d 4.0 1.0
a 1.0
b 2.0
c 3.0
d 4.0
Name: one, dtype: float64
one 1.0
two 4.0
Name: a, dtype: float64
one 1.0
two 4.0
Name: a, dtype: float64
one two three flag
a 1.0 4.0 4.0 False
b 2.0 3.0 6.0 False
c 3.0 2.0 6.0 True
d 4.0 1.0 4.0 True
删除
# 删除数据
del df4['two']
df4.pop('three')
print(df4)
结果如下:
one flag
a 1.0 False
b 2.0 False
c 3.0 True
d 4.0 True
增加
插入标量值,将会全部的列都插入,如下:
# 插入数据
df4['foo'] = 'bar'
print(df4)
结果如下
one flag foo
a 1.0 False bar
b 2.0 False bar
c 3.0 True bar
d 4.0 True bar
插入与 DataFrame 索引不同的 Series 时,以 DataFrame 的索引为准:
df4['one_trunc'] = df4['one'][:2]
print(df4)
结果如下:
one flag foo one_trunc
a 1.0 False bar 1.0
b 2.0 False bar 2.0
c 3.0 True bar NaN
d 4.0 True bar NaN
可以插入原生多维数组,但长度必须与 DataFrame 索引长度一致。
可以使用 insert 方法插入数据,默认在 DataFrame 尾部插入列,但是可以手动指定插入列的位置,从 0 起算,示例如下:
df4.insert(1, 'bar', df4['one'])
print(df4)
结果如下:
one bar flag foo one_trunc
a 1.0 1.0 False bar 1.0
b 2.0 2.0 False bar 2.0
c 3.0 3.0 True bar NaN
d 4.0 4.0 True bar NaN
示例代码
老规矩,所有的示例代码都会上传至代码管理仓库 Github 和 Gitee 上,方便大家取用。
参考
https://www.pypandas.cn/docs/getting_started/dsintro.html
小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame的更多相关文章
- 小白学 Python 数据分析(3):Pandas (二)数据结构 Series
在家为国家做贡献太无聊,不如跟我一起学点 Python 顺便问一下,你们都喜欢什么什么样的文章封面图,老用这一张感觉有点丑 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析( ...
- 小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据
在家为国家做贡献太无聊,不如跟我一起学点 Python 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Panda ...
- 小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 小白学 Python 数据分析(7):Pandas (六)数据导入
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 小白学 Python 数据分析(8):Pandas (七)数据预处理
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 小白学 Python 数据分析(9):Pandas (八)数据预处理(2)
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 小白学 Python 数据分析(10):Pandas (九)数据运算
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 小白学 Python 数据分析(11):Pandas (十)数据分组
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 小白学 Python 数据分析(12):Pandas (十一)数据透视表(pivot_table)
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
随机推荐
- 二、Spring Cloud之注册中心 Eureka
前言 算是正式开始学习 spring cloud 的项目知识了,大概的知道Springcloud 是由众多的微服务组成的,所以我们现在一个一个的来学习吧. 注册中心,在微服务中算是核心了.所有的服务都 ...
- .Net Core使用分布式缓存Redis:Lua脚本
一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用L ...
- 数据量不足,MedicalNet 如何助力医疗影像 AI 突破瓶颈?
导读 |近日,云+社区技术沙龙“腾讯开源技术”圆满落幕.本次沙龙邀请了多位腾讯技术专家,深度揭秘了腾讯开源项目TencentOS tiny.TubeMQ.Kona JDK.TARS以及Medical ...
- P1828 香甜的黄油 Sweet Butter 最短路 寻找一个点使得所有点到它的距离之和最小
P1828 香甜的黄油 Sweet Butter 闲来无事 写了三种最短路(那个Floyed是不过的) 题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1 ...
- MySql数据主从同步配置
由于需要配置MySQL的主从同步配置,现将配置过程记录下,已被以后不时之需 MySql数据主从同步 1.1. 同步介绍 Mysql的 主从同步 是一个异步的复制过程,从一个 Master复制到另一 ...
- 洛谷p1137 模拟退火
题目链接:https://www.luogu.org/problem/P1337 以x为原点,将力分解成横纵方向的力,每次退火时单独对答案的横纵坐标进行判断是否更新答案 #include<ios ...
- CodeSign error: no provisioning profile at path '/Users/zhht-2015/Library/MobileDevice/Provisioning Profiles/79693141-f98b-4ac4-8bb4-476c9475f265.mobileprovision'
解决方法: 1.关闭Xcode,找到项目中的**.xcodeproj文件,点击右键,show package contents(打开包内容). 2.打开后找到project.pbxproj文件,用文本 ...
- matplotlib 条形图
一.特点 离散数据,数据之间没有直接的关系 二.分类 1.垂直条形图 bar(x, height, width=0.8) # x 为x轴 # height 为y轴 # width 为 条形图的宽度 例 ...
- redis 注意事项
1.scan_iter car_key = 'shopping*' # print(car_key) data_li = [] for i in con.scan_iter(car_key): # p ...
- [LOJ#3044][动态DP]「ZJOI2019」Minimax 搜索
题目传送门 容易想到一种暴力 DP:先转化成对于每个 \(k\) 求出 \(\max_{i\in S}|i-w_i|\le k\) 的方案数,最后差分 然后问题转化成每个叶子的权值有个取值区间,注意这 ...