Pandas学习笔记
一、pandas基本数据结构
1、Series对象
带索引数据构成的一维数组(将一组索引和一组数据绑定在一起)
将类型键映射至一组类型值
pd.Series(data,index = index)
#index为可选参数
获取Series对象数据:
values方法、index方法、标签索引
data = pd.Series([1,2,3.00,4,5.0])
data
–> 0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
dtype: float64
#values方法
data.values
–>array([1., 2., 3., 4., 5.])
#index方法
data.index
–>RangeIndex(start=0, stop=5, step=1)
#标签索引
data[0:3]
–>0 1.0
1 2.0
2 3.0
dtype: float64
series可定义索引
例:
data = pd.Series([1,2,3.00,4,5.0],index = [‘a’,‘b’,‘c’,‘d’,‘e’])
data
–>a 1.0
b 2.0
c 3.0
d 4.0
e 5.0
dtype: float64
注:Series为显式索引,索引可更改。Numpy数组为隐式索引,索引为整数索引,不可定义。
可以直接利用字典创建一个Series对象,字典的键自动创建为索引,值不变
Series可以利用索引筛选字典元素
例:
pd.Series({0:’ a ‘,1:’ b ‘,2:’ c '}, index = [0,2])
–>0 a
2 c
dtype: object
#Series对象会保留显式定义的键值对
2、DataFrame对象
可看作多维Series对象
pd.DataFrame(data, columns = columns , index = index)
例:
name = pd.Series({‘a’:1,‘b’:2,‘c’:3})
num = pd.Series([11,22,33],index = [‘a’,‘b’,‘c’])
data = pd.DataFrame({‘name’:name,‘number’:num})
data
–>
name number
a 1 11
b 2 22
c 3 33
#索引值需保持一致
#若索引不一致,则会出现问题:num = pd.Series([11,22,33])
name = pd.Series({‘a’:1,‘b’:2,‘c’:3})
data = pd.DataFrame({‘name’:name,‘number’:num})
data
–>
name number
a 1.0 NaN
b 2.0 NaN
c 3.0 NaN
0 NaN 11.0
1 NaN 22.0
2 NaN 33.0
index属性、columns属性
#index属性
获取索引
data.indexIndex([‘a’, ‘b’, ‘c’], dtype=‘object’)
#columns属性
data.columnsIndex([‘name’, ‘number’], dtype=‘object’)
3、Index对象
可看作不可变数组
遵循标准库集合的多种用法,包括求交并集等
包含部分与NumPy数组相似属性,如:.size , .shape , .ndim , .dtype等
操作对象 | 特点 |
---|---|
Serise对象 | 显式索引,可更改 |
DataFrame对象 | 显式索引,可更改 |
Index对象 | 索引不可更改 |
二、数据操作
1、数据取值与选择
取值
Series | DataFrame |
---|---|
键值对映射 | 键值对映射 |
in操作 | values属性(按行查看数据) |
keys() | |
items() |
选择
Series :索引器
直接使用索引,在索引为整数时切片操作默认使用隐式索引,取值操作默认使用显式索引
索引器 | 作用 |
---|---|
loc | 表示取值和切片都是显式的 |
iloc | 表示取值和切片都是隐式的 |
ix | 混合形式,等价于标准库列表取值 |
DataFrame:使用Series索引器,保留行列标签
2、数值运算
与Numpy通用函数使用方法类似
索引会自动对齐,索引合并方式类似求并集
DataFrame对象可以通过fill_value参数设置缺失值
3、缺失值
None:
是一个Python对象,只能用于Object数组类型,不能做Numpy/Pandas数组类型的缺失值
如果使用含None的数组进行运算会报错
NaN:
特殊浮点数
无论进行何种操作都会被同化为NaN
使用累计函数时不会报错,但输出会变为NaN
Numpy提供特殊累计函数,忽略缺失值计算,如:np.nansum() , np.nansin() …
例:
x = np.array([1,np.nan,3,4])
x.dtypedtype(‘float64’)
x.sum()
nan
np.nansum(x)
8.0
注:pandas会将nan和none自动转化为nan
Pandas处理缺失值方法
isnull():返回一个由布尔类型组成的掩码数据
x = pd.Series([1,np.nan,3,None])
x.isnull()0 False
1 True
2 False
3 True
dtype: bool
notnull():与isnull()相反
x.notnull()
0 True
1 False
2 True
3 False
dtype: bool
注: isnull(),notnull() 方法产生布尔数组,可做为索引选取非缺失数据或缺失数据
dropna():返回剔除缺失值后的数据
#Series对象
x.dropna()0 1.0
2 3.0
dtype: float64#DataFrame对象
y = pd.DataFrame([[1,np.nan,3,4],[5,6,None]])
#只能剔除整行或整列
#默认剔除整行
#axis参数设置
y.dropna()Empty DataFrame
Columns: [0, 1, 2, 3]
Index: []y.dropna(axis = ‘columns’) #此处axis = 1 结果相同
0
0 1
1 5#通过how或thresh参数设置提出行或列的缺失值数量阈值
fillna():填充缺失值
#Series对象
#直接使用指定的值填充
x.fillna(number)
#使用缺失值前面的有效值向后填充(forward-fill)
x.fillna(method = ‘ffill’)
#向前填充
x.fillna(method = ‘bfill’)#DataFrame对象
#设置axis参数
三、合并操作
1、Concat 和 Append操作
1、 pd.concat
语法类似于np.concatenate()
索引会保留:pd.concat 相比 np.concatenate ,pandas中的用法在索引相同时也会保留原数据索引值,而不会被合并。
针对该特性可进行的操作:
verify_integrity 参数
设置 verify_integrity = True 如果合并结果出现重复索引将会打印错误信ignore_index 参数
设置为True 合并时将会为合并结果创建新的整数索引key 参数 通过该参数 添加新的多级索引 join 和 join_axes 参数 交集合并 : join = 'inner' 并集合并 : join = 'outer'
2、 append()方法
2、pd.merge()和df1.join(df2)
1、pd.merge()
该操作方法可以进行一对一,多对一,多对多连接操作
一对一情况:两DataFrame数据键不重复的情况下,会自动选择某一columns下的键进行忽略索引的合并
多对一情况:合并时会保留重复值并对相同键对应的数据内容进行重复填补
多对多情况:自动对齐相互填补
on参数
可设置为列名字符串或者包含多列名称列表进行指定合并填补操作
left_on 和 right_on 参数
合并列名不同的数据集,对多出一列相同的键,可用drop(‘name’,axis = )操作删除
参数设置为列名
left_index 和 right_index参数
合并列和索引
参数设置为True
how参数
数据连接方式
默认参数为 how = ‘inner’
参数 | 形式 |
---|---|
inner | 内连接,即求交集 |
outer | 外连接,即求并集 |
left | 左连接,以第一个参数为标准 |
right | 右连接 |
该方法可以通过设置_index 和 _on 参数进行索引和列的混合使用
pd.merge(df1,df2,left_index = True, right_on = ’name’)
该操作同时进行合并和列名选择,保留right_on所选择的列名和位置
suffixes参数
自定义重复列名后缀
2、df1.join(df2)
直接按照索引进行数据合并,效果同上merge操作中的_index和_on参数
四、累计与分组
累计
累计函数,略
分组:GroupBy
1、groupby()
按列取值,返回一个groupby对象
df.groupby(‘column’)
2、累计:aggregate()
一次性计算所有累计值
df.groupby(‘key’).aggregate([‘min’,np.median,max]])
使用字典指定不同列的累计函数
df.groupby(‘key’).aggregate({‘data1’: ‘max’,‘data2’: ‘min’})
3、过滤:filter()
按照分组属性过滤某些值
例:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
rng = np.random.RandomState(0)
df = pd.DataFrame({'key':['A','B','C','A','B','C'],
'data1':range(6),
'data2':rng.randint(0,10,6)},
columns = ['key','data1','data2'])
print(df)
def filter_func(x):
return x['data2'].std() >4
print('def')
print(filter_func)
print(df.groupby('key')['data2'].std())
print('df.groupby(''key'')')
print(df.groupby('key').std())
print('filter')
print(df.groupby('key').filter(filter_func))
#即:df.groupby('key'['data2'].std())
4、转换:transform()