文章目录
Series
import pandas as pd
from pandas import Series, DataFrame
S1 = pd.Series([2, 5, -9, 13, -22, 58])
print(S1)
# 查看索引,默认0--N-1
S1.index
- 添加索引
# 添加索引
S2 = pd.Series([2,5,-9,13,-22,58],index=['A','B','C','D','E','F'])
print(S2)
- 访问数据
# 访问数据
import pandas as pd
S3= pd.Series([1,2,3,4,5,6,7,8,9,10])
print(S3[0])
- 查找前三行
# 查找前三行
import pandas as pd
S3= pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(S3[:3])
- 查找最后三行
# 查找最后三行
import pandas as pd
S3= pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(S3[-3:])
- 使用标签索引数据
# 使用标签索引数据
import pandas as pd
S3= pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(S3[['b','c','d']])
Series基本功能
- axes属性:获取行轴标签列表
# axes属性获取行轴标签列表
import pandas as pd
import numpy as np
Series2 = pd.Series(np.random.randn(5))
Series2.axes
- 查看系列的类型
# 查看系列的类型
import pandas as pd
Series2 = pd.Series([2.1, 2.9, 3.8, 2.3, 2.9, 3.7])
Series2.dtype
- 判断是否为空
# 判断是否为空
import pandas as pd
import numpy as np
Series2 = pd.Series(np.random.randn(5))
Series2.empty
- 判断维度
# 判断维度
Series2.ndim
- 判断序列长度
# 判断序列长度
import pandas as pd
import numpy as np
Series2 = pd.Series(np.random.randn(10))
Series2.size
- 返回系列实际数值
# 返回系列实际数值
Series2.values
- 查看前三组数据
# 查看前三组数据
Series2.head(3)
- 返回最后N行的数据,默认为5行
# 返回最后N行的数据,默认为5行
Series2.tail(3)
DataFrame:数据帧
import pandas as pd
data = {'province': ['beijing', 'beijing', 'beijing', 'shanghai', 'shanghai', 'shanghai'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'gdp': [2.1, 2.9, 3.8, 2.3, 2.9, 3.7]}
frame1 = pd.DataFrame(data)
frame1
- 查看前三行数据
# 查看前三行数据
frame1.head(3)
- 指定序列顺序
# 指定序列顺序
pd.DataFrame(frame1, columns=['year', 'province', 'gdp'])
- 基本操作
# 基本操作
import pandas as pd
data = {'province': ['beijing', 'beijing', 'beijing', 'shanghai',
'shanghai', 'shanghai'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'gdp': [2.1, 2.9, 3.8, 2.3, 2.9, 3.7]}
frame2 = pd.DataFrame(data, columns=['year', 'province', 'gdp',
'debt'],index=['one', 'two', 'three', 'four', 'five', 'six'])
frame2
DataFrame 基本功能
import pandas as pd
import numpy as np
data = {'province':pd.Series(['beijing','shanghai','tianjin',
'chongqing']),
'gdp':pd.Series([2.1, 2.9, 3.8, 2.3]),
'population':pd.Series([2.2,2.5,1.4,3.2])}
df = pd.DataFrame(data)
df
行列交换,T
# 行列交换,T
df.T
- 返回行标签和列标签的列表
# 返回行标签和列标签的列表
df.axes
- 查看数据类型df.dtypes
- 判断是否为空df.empty
- 查看维度df.ndim
- 查看元素个数df.size
- 查看属性值df.values
- 查看前两行数据df.head(2)
- 查看后三行数据df.tail(3)
pandas核心数据结构有两种,即一维的series和二维的dataframe,二者可以分别看做是在numpy一维数组和二维数组的基础上增加了相应的标签信息。正因如此,可以从两个角度理解series和dataframe:
series和dataframe分别是一维和二维数组,因为是数组,所以numpy中关于数组的用法基本可以直接应用到这两个数据结构,包括数据创建、切片访问、通函数、广播机制等
series是带标签的一维数组,所以还可以看做是类字典结构:标签是key,取值是value;而dataframe则可以看做是嵌套字典结构,其中列名是key,每一列的series是value。所以从这个角度讲,pandas数据创建的一种灵活方式就是通过字典或者嵌套字典,同时也自然衍生出了适用于series和dataframe的类似字典访问的接口,即通过loc索引访问
关于series和dataframe数据结构本身,有大量的方法可用于重构结构信息:
-
rename,可以对标签名重命名,也可以重置index和columns的部分标签列信息,接收标量(用于对标签名重命名)或字典(用于重命名行标签和列标签)
-
reindex,接收一个新的序列与已有标签列匹配,当原标签列中不存在相应信息时,填充NAN或者可选的填充值
-
set_index/reset_index,互为逆操作,前者是将已有的一列信息设置为标签列,而后者是将原标签列归为数据,并重置为默认数字标签
-
set_axis,设置标签列,一次只能设置一列信息,与rename功能相近,但接收参数为一个序列更改全部标签列信息(rename中是接收字典,允许只更改部分信息)
-
rename_axis,重命名标签名,rename中也可实现相同功能
读写
读取数据
- read_csv()
import pandas as pd
import numpy as np
data2=pd.read_csv('./example01.csv', header=None)
data2
- 设置列名
# 设置列名
import pandas as pd
import numpy as np
data2=pd.read_csv('./example01.csv',
names=['var1', 'var2', 'var3', 'var4', 'class'])
data2
- 为索引添加变量名
# 为索引添加变量名
import pandas as pd
import numpy as np
varlist=['var1', 'var2', 'var3', 'var4', 'class']
data3=pd.read_csv('./example01.csv',
names=varlist,index_col='class')
data3
写入数据
import pandas as pd
import numpy as np
data1.to_csv('./data1_new.csv')
data1.to_csv('./data1_new2.csv', sep='-')
- 写入时删除列明和行索引
# 删除列明和行索引
data1.to_csv('./data1_new3.csv',
sep='|',
index=False,
header=False)
索引和数据选择
# 索引和选择数据
import pandas as pd
import numpy as np
frame3 = pd.DataFrame(np.random.randn(6, 4),
index = ['a','b','c','d','e','f'],
columns = ['A', 'B', 'C', 'D'])
frame3
- 基于标签索引
# 基于标签索引
frame3.loc[:,['C','D']]
frame3.loc[['a','d','f'],['C','D']]
基于整数索引
基于整数索引
前三行
frame4.iloc[:3]
frame4.iloc[1:4, 1:3]
数据合并
- merge:仅支持横向拼接,通过设置连接字段,实现对同一记录的不同列信息连接,支持inner、left、right和outer4种连接方式
参数 | 说明 |
---|---|
how | 默认为inner,可设为inner/outer/left/right |
on | 根据某个字段进行连接,必须存在于两个DateFrame中(若未同时存在,则需要分别使用left_on和right_on来设置) |
left_on | 左连接,以DataFrame1中用作连接键的列 |
right_on | 右连接,以DataFrame2中用作连接键的列 |
left_index | 将DataFrame1行索引用作连接键 |
right_index | 将DataFrame2行索引用作连接键 |
sort | 根据连接键对合并后的数据进行排列,默认为True |
suffixes | 对两个数据集中出现的重复列,新数据集中加上后缀_x,_y进行区别 |
df1 = pd.DataFrame({'key': ['a', 'a', 'a', 'b', 'c', 'd', 'e'],
'var1': range(7)})
df1
df2 = pd.DataFrame({'key': ['a', 'b', 'd'],
'var2': range(3,6)})
df2
pd.merge(df1, df2)
pd.merge(df1, df2, on='key')
累计与分组
import pandas as pd
import numpy as np
classinfo=pd.read_csv("./class.csv")
classinfo.head()
# 根据性别分组
print(classinfo.groupby('Sex'))
# 分组并查看结果
print(classinfo.groupby('Sex').groups)
# 返回的是索引序列
# 根据性别和年龄分组
print(classinfo.groupby(['Sex','Age']).groups)
# 把一个组取出来
Sex_grouped = classinfo.groupby('Sex')
print (Sex_grouped.get_group('F'))
聚合
# 聚合
import pandas as pd
import numpy as np
grouped = classinfo.groupby('Sex')
print (grouped['Age'].agg(np.mean))
print (grouped.agg(np.size))
# 计算体重的和,均值和标准差
grouped = classinfo.groupby('Age')
agg = grouped['Weight'].agg([np.sum, np.mean, np.std])
print (agg)
classinfo.describe()
classinfo.groupby('Sex')['Height','Weight'].describe()
classinfo.groupby('Sex')['Height','Weight'].describe().T
缺失值处理
import pandas as pd
from numpy import nan as NA
df = pd.DataFrame(np.random.randn(7, 3))
df.iloc[1:5, 1] = NA
df.iloc[3:6, 2] = NA
df
- 判断缺失值:isnull()和notnull()
- 0填充缺失值:df.fillna(0)
- 用前一个值填充:df.fillna(method=‘ffill’)
- 平均值填充:data.fillna(data.mean())
- 删除缺失值:data.dropna()
绘图
条形图
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,3),columns=['a','b','c'])
df.plot.bar()
#df.plot.bar(stacked=True):表示面积堆积
#df.plot.barh():水平图
直方图
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':np.random.randn(100)+1,
'b':np.random.randn(100)},
columns=['a', 'b'])
df.plot.hist(bins=20)
箱型图
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 3), columns=['a', 'b', 'c'])
df.plot.box()
面积图
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(7, 3), columns=['a', 'b', 'c'])
df.plot.area()
散点图
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(100, 2), columns=['a', 'b'])
df.plot.scatter(x='a', y='b')
饼状图
import pandas as pd
import numpy as np
df = pd.DataFrame(10 * np.random.rand(5),
index=['a', 'b', 'c','d','e'],
columns=['x'])
df.plot.pie(subplots=True)