Pandas总结

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)
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值