Python笔记:Pandas查询手册

DataFrame创建
DataFrame的创建有几种方式
import numpy as np
from pandas import Series,DataFrame
import pandas as pd
# 1.二维数组创建,自动生成行索引和列索引
DataFrame(np.arange(10).reshape(2,5))
# ====结果====
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
# 2.字典创建,注意字典的数据格式:字典的值是数组、列表或元组
data = {
'name':['张三', '李四', '王五', '小明'],
'sex':['female', 'female', 'male', 'male'],
'year':[2001, 2001, 2003, 2002],
'city':['北京', '上海', '广州', '北京']
}
df = DataFrame(data)
df #注意生成的DataFrame的列索引和原始字典中键、值的关系
#====结果====
name sex year city
0 张三 female 2001 北京
1 李四 female 2001 上海
2 王五 male 2003 广州
3 小明 male 2002 北京
# 3.嵌套字典创建
data2 = {
'sex':{'张三':'female','李四':'female','王五':'male'},
'city':{'张三':'北京','李四':'上海','王五':'广州'}
}
df2 = DataFrame(data2)
df2
#====结果====
sex city
张三 female 北京
李四 female 上海
王五 male 广州
Dataframe索引
#指定列索引顺序
df = DataFrame(data, columns=['name', 'sex', 'year', 'city'])
df
#====结果====
name sex year city
0 张三 female 2001 北京
1 李四 female 2001 上海
2 王五 male 2003 广州
3 小明 male 2002 北京
#指定行索引和列索引
df = DataFrame(data, columns=['name', 'sex', 'year', 'city'],index=['a', 'b', 'c', 'd'])
df
#====结果====
name sex year city
a 张三 female 2001 北京
b 李四 female 2001 上海
c 王五 male 2003 广州
d 小明 male 2002 北京
Dataframe表头起名
df.index.name = 'id'
df.columns.name = 'std_info'
df
#====结果====
std_info name sex year city
id
a 张三 female 2001 北京
b 李四 female 2001 上海
c 王五 male 2003 广州
d 小明 male 2002 北京
Dataframe属性
# 1.DataFrame的数据转换为二维数组
df.values
#====结果====
array([['张三', 'female', 2001, '北京'],
['李四', 'female', 2001, '上海'],
['王五', 'male', 2003, '广州'],
['小明', 'male', 2002, '北京']], dtype=object)
# 2.DataFrame表的行索引、列索引
df.index
df.columns
#====结果====
Index(['a', 'b', 'c', 'd'], dtype='object')
Index(['name', 'sex', 'year', 'city'], dtype='object')
DataFrame索引
索引对象
索引对象Index无法修改,但可以进行遍历
obj = Series([1, -2, 3, -4], index=['a', 'b', 'c', 'd'])
obj
#====结果====
a 1
b -2
c 3
d -4
dtype: int64
# 1.索引对象不可以修改
index = obj.index
index[1] = 'f'
#====结果====
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-4f995da5e969> in <module>()
1 index = obj.index
----> 2 index[1] = 'f'
F:\Anaconda\envs\data-analysis\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
1668
1669 def __setitem__(self, key, value):
-> 1670 raise TypeError("Index does not support mutable operations")
1671
1672 def __getitem__(self, key):
TypeError: Index does not support mutable operations
# 2.索引对象可以索引
index[1]
#====结果====
'b'
# 3.索引对象也是一个集合,因此也可以用in操作符
'sex' in df.columns
'f' in df.index
#====结果====
True
False
Pandas索引操作
重新索引
df.reindex():可以对行、列重新排序,也可以增加删除行、列
注意:reindex() 方法不会改变原来的df结构
obj = Series([1, -2, 3, -4], index=['b', 'a', 'c', 'd'])
# 1.重新索引就是重新排序,自动补齐
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])#默认不填充
obj2
#====结果====
a -2.0
b 1.0
c 3.0
d -4.0
e NaN
dtype: float64
obj = Series([1, -2, 3, -4], index=[0,2,3,5])
# 2.method参数指定缺失值填充方式
obj2 = obj.reindex(range(6),method='ffill')#用前面的值填充
obj3 = obj.reindex(range(6),method='bfill')#用后面的值填充
obj2
obj3
#====结果====
0 1
1 1
2 -2
3 3
4 3
5 -4
dtype: int64
0 1
1 -2
2 -2
3 3
4 -4
5 -4
dtype: int64
#fill_value指定缺失值填充的值
df3 = df2.reindex(columns=['name', 'year', 'id'], fill_value=0)
df3
#====结果====
#删去了sex属性,增添了year属性,填充为0
name year id
a 0.0 0 1.0
b NaN 0 NaN
c 3.0 0 4.0
d 6.0 0 7.0
更换索引
- set_index()将列数据作为行索引
- reset_index()将索引作为数据列,与set_index()方法相反
data = {
'name':['张三', '李四', '王五', '小明'],
'sex':['female', 'female', 'male', 'male'],
'year':[2001, 2001, 2003, 2002],
'city':['北京', '上海', '广州', '北京']
}
df = DataFrame(data)
df
#====结果====
name sex year city
0 张三 female 2001 北京
1 李四 female 2001 上海
2 王五 male 2003 广州
3 小明 male 2002 北京
df2 = df.set_index('name') #注意,不改变df
df2
#====结果====
sex year city
name
张三 female 2001 北京
李四 female 2001 上海
王五 male 2003 广州
小明 male 2002 北京
df3 = df2.reset_index() #也不改变df2
df3
#====结果====
name sex year city
0 张三 female 2001 北京
1 李四 female 2001 上海
2 王五 male 2003 广州
3 小明 male 2002 北京
- df.sort_values(by=’ ')
sort_value方法排序不改变原DataFrame,并且索引不会排序,跟着行一块动,即:索引与行绑定。(除非重新赋予新的df)
data = {
'name':['张三', '李四', '王五', '小明'],
'grade':[68, 78, 63, 92]
}
df = DataFrame(data)
df
#====结果====
name grade
0 张三 68
1 李四 78
2 王五 63
3 小明 92
# sort_value方法排序不改变原DataFrame,排序之后索引会改变,与Excel不同
df2 = df.sort_values(by='grade')
df2
#====结果====
name grade
2 王五 63
0 张三 68
1 李四 78
3 小明 92
#reset_index之后,原来的列索引被添加为一列,用drop=True去除原索引
df3 = df2.reset_index()
df3
#====结果====
index grade name
0 2 63 王五
1 0 68 张三
2 1 78 李四
3 3 92 小明
df4 = df2.reset_index(drop=True)
df4
#====结果====
grade name
0 63 王五
1 68 张三
2 78 李四
3 92 小明
索引和选取
Series结构索引切片
obj = Series([1, -2, 3, -4], index=['a', 'b', 'c', 'd'])
# 1.可以通过0~(n-1)索引
obj[1]
#====结果====
-2
# 2.也可以通过设置的索引标签来索引
obj['b']
obj[['a','c']]
#====结果====
-2
# 3.切片
obj[0:2]
obj['a':'c'] #利用索引标签索引时,尾端是被包含的
#====结果====
a 1
b -2
dtype: int64
a 1
b -2
c 3
dtype: int64
DataFrame的行和列选取都有具体的方法
1. 选取列:列索引标签或属性形式
data = {
'name':['张三', '李四', '王五', '小明'],
'sex':['female', 'female', 'male', 'male'],
'year':[2001, 2001, 2003, 2002],
'city':['北京', '上海', '广州', '北京']
}
df = DataFrame(data)
df
#====结果====
name sex year city
0 张三 female 2001 北京
1 李四 female 2001 上海
2 王五 male 2003 广州
3 小明 male 2002 北京
# 1.取一列
df['city'] #以列索引标签形式,返回Series结构
df.city #以属性方式,,返回Series结构
df[['city']] #返回DataFrame结构
#====结果====
0 北京
1 上海
2 广州
3 北京
Name: city, dtype: object
0 北京
1 上海
2 广州
3 北京
Name: city, dtype: object
city
0 北京
1 上海
2 广州
3 北京
df[['city','sex']]
#====结果====
city sex
0 北京 female
1 上海 female
2 广州 male
3 北京 male
直接选取列时不能使用切片,也没有位置
# df选取多列,不能使用切片!!
df[['sex':'city']]
# df['sex':'city']也不行
#====结果====
File "<ipython-input-56-d6386b7eaceb>", line 1
df[['sex':'city']]
^
SyntaxError: invalid syntax
2. 选取行:行位置或行索引标签(loc()或iloc()方法)
df[2] 会报错,应该使用 df[2:3] 或 df.iloc[2] 来取出第2行,返回Series结构。
以索引位置方式,注意,必须“切片”
#选取行,切片
df.iloc[:3]
#同等于df[:3]
#df[2]会报错,应该使用df[2:3]或df.iloc[2}来取出第2行
#====结果====
name sex year city
0 张三 female 2001 北京
1 李四 female 2001 上海
2 王五 male 2003 广州
df2['李四':'小明'] #以行索引标签方式
#====结果====
sex year city
name
李四 female 2001 上海
王五 male 2003 广州
小明 male 2002 北京
- 不用loc或iloc,选取行时必须用“切片”方式,选取列时不能使用“切片”。
- 选取行:行位置或行索引标签(loc()或iloc()方法)
- loc和iloc可以切片,也可以不切片。loc: locat, iloc:i-integer
- loc取行数据,不用指定列
df2
#====结果====
sex year city
name
张三 female 2001 北京
李四 female 2001 上海
王五 male 2003 广州
小明 male 2002 北京
#按行索引标签选取数据。注意,不能使用df2['张三']
df2.loc['张三']
#====结果====(Series结构)
sex female
year 2001
city 北京
Name: 张三, dtype: object
df2.loc[['张三']] #两对[],里面的[]有“组合”的含义
#====结果====(df结构)
sex year city
name
张三 female 2001 北京
df2.loc[['张三','王五']] #“张三”和“王五”的组合
#====结果====(df结构)
sex year city
name
张三 female 2001 北京
王五 male 2003 广州
df2.loc[['张三':'王五']] #出错,不能用切片来“组合”
# 应该使用 df2.loc['张三':'王五'],包含尾端
#====结果====
File "<ipython-input-153-e34357cebaa9>", line 1
df2.loc[['张三':'王五']] #出错,不能用切片来“组合”
^
SyntaxError: invalid syntax