DataFrame对象的使用
创建
接收一个字典
In [1]: import pandas as pd
In [2]: dic1 = {"name": ["张三", "李四"], "age": [22, 18], "gender": ["男", "女"]}
In [3]: df1 = pd.DataFrame(dic1)
In [4]: df1
Out[4]:
name age gender
0 张三 22 男
1 李四 18 女
-
当接受一个字典作为参数时, 字典的keys会作为表格的列标签, 表格的记录索引index (也就是横标签) 默认从0开始自增, keys对应的values会在相应的列标签下排成一列
-
字典中至少有一个key对应的value是列表, 并且所有出现的列表都必须是相同长度
In [5]: dic1_test = {"name": "张三", "age": 22, "gender": "男"} In [6]: df1_test = pd.DataFrame(dic1_test) ValueError: If using all scalar values, you must pass an index In [7]: dic1_test2 = {"name": ["张三", "李四"], "age": 22, "gender": ["男"]} In [8]: df1_test2 = pd.DataFrame(dic1_test2) ValueError: arrays must all be same length
-
表格的index(也就是行数)默认是列表的长度, 如果字典的values中没有列表, 则必须人为指定index
-
index 是一个列表类型, 里面存放行标签, 标量的values会被自动重复相应的次数(列表的长度)
In [10]: df1_test3 = pd.DataFrame(dic1_test, index=["a", 1, [1]]) In [11]: df1_test3 Out[11]: name age gender a 张三 22 男 1 张三 22 男 [1] 张三 22 男
-
-
values可以为空列表, 这样的话, 表格为空, 只有列标签, index为[]
In [12]: dic1_test4 = {"name": "张三", "age": 22, "gender": []} In [13]: df1_test4 = pd.DataFrame(dic1_test4) In [14]: df1_test4 Out[14]: Empty DataFrame Columns: [name, age, gender] Index: []
接收一个列表
一维列表
- 接收一个一维列表作为参数时, 列标签 和 行标签 都是从0开始自增.
- 每一个元素作为一条横向记录 (共同组成一个列向量)
In [19]: arr = ["张三", 22, "男"]
In [20]: df2 = pd.DataFrame(arr)
In [21]: df2
Out[21]:
0
0 张三
1 22
2 男
字典列表
- 当接受的是一个字典的列表时 , 字典的keys默认称为列标签, 依然是数组中的每一个元素作为一条横向记录 (字典)
In [35]: arr4 = [{"name": "张三", "age": 22, "gender": "男"}, {"name": "李雪", "age": 18, "gender": "女"}]
In [36]: df5 = pd.DataFrame(arr4)
In [37]: df5
Out[37]:
name age gender
0 张三 22 男
1 李雪 18 女
- 当每个字典的keys不一样时, 会把出现的所有keys作为标签, 字典中缺少该值的默认设置为NaN
In [38]: arr5 = [{"name": "张三", "age": 22, "gender": "男"}, {"name": "李雪", "age": 18, "gen": "女"}]
In [39]: df6 = pd.DataFrame(arr5)
In [40]: df6
Out[40]:
name age gender gen
0 张三 22 男 NaN
1 李雪 18 NaN 女
二维列表
- 当接收二维列表时, 二维列表的大小就是表格的大小, 比如上例中二维列表是23, 最后输出的表格也是23, 二维列表中每一个列表元素作为一条横向记录.
- 列标签 和 行标签 依然从0开始自增
In [22]: arr2 = [["张三", 22, "男"],["李雪", 18, "女"]]
In [23]: df3 = pd.DataFrame(arr2)
In [24]: df3
Out[24]:
0 1 2
0 张三 22 男
1 李雪 18 女
- 可以指定列标签 和 行标签 具体是什么
In [28]: df4 = pd.DataFrame(arr2, index=[1,2], columns=["姓名", "年龄", "性别"])
In [29]: df4
Out[29]:
姓名 年龄 性别
1 张三 22 男
2 李雪 18 女
查询
获取某一列的所有记录
- 返回值类型 Series
In [64]: df
Out[64]:
name age gender
0 张三 22 男
1 李四 18 女
2 李雪 18 女
In [65]: df['name']
Out[65]:
0 张三
1 李四
2 李雪
Name: name, dtype: object
获取某一列记录的逻辑索引
- 返回值类型 Series
In [66]: df['age'] == 18
Out[66]:
0 False
1 True
2 True
Name: age, dtype: bool
根据逻辑索引获取指定的一整条横向记录
- 返回值类型 DataFrame
In [67]: df[df['age']==18]
Out[67]:
name age gender
1 李四 18 女
2 李雪 18 女
获取指定列和行的元素(先列后行)
- 返回值类型 基本类型
In [68]: df['name'][2]
Out[68]: '李雪'
根据逻辑索引获取指定的列记录
- 返回值类型 Series
In [71]: df['name'][df['age']==18]
Out[71]:
1 李四
2 李雪
Name: name, dtype: object
获取前几行记录
In [78]: df.head(1)
Out[78]:
name age gender
0 张三 22 男
In [79]: df.head(2)
Out[79]:
name age gender
0 张三 22 男
1 李四 18 女
获取前几行记录
In [104]: df.tail(2)
Out[104]:
name age gender
2 李雪 18 女
6 田七 19 男
根据列 降序排序后, 获取前几行记录
In [81]: df.nlargest(1,'age')
Out[81]:
name age gender
0 张三 22 男
In [82]: df.nlargest(2,'age')
Out[82]:
name age gender
0 张三 22 男
1 李四 18 女
根据列 升序排序后, 获取前几行记录
In [83]: df.nsmallest(2,'age')
Out[83]:
name age gender
1 李四 18 女
2 李雪 18 女
In [84]: df.nsmallest(1,'age')
Out[84]:
name age gender
1 李四 18 女
将每一行记录和索引打包成一个元组放入一个迭代器中
In [93]: for item in df.iterrows():
...: print(type(item))
...: print(item)
...:
<class 'tuple'>
(0, name 张三
age 22
gender 男
Name: 0, dtype: object)
<class 'tuple'>
(1, name 李四
age 18
gender 女
Name: 1, dtype: object)
<class 'tuple'>
(2, name 李雪
age 18
gender 女
Name: 2, dtype: object)
修改
新增一行
In [100]: df.loc[6] = ["王五", 19, "男"]
In [101]: df
Out[101]:
name age gender
0 张三 22 男
1 李四 18 女
2 李雪 18 女
6 王五 19 男