定义
Pandas是基于Numpy的一种工具,目的是解决数据分析任务。通过纳入大量库和一些标准数据模型,提供了高效操作大型数据集所需工具;
安装
pip install pandas
数据类型
Series
- 定义
一维的数组类型,其中每个元素有各自标签;可当作一个由带标签元素组成的numpy数组,标签可以是数字或字符; - 关键点
- 均匀数据;
- 尺寸大小不变;
- 数据的值可变;
Dataframe
- 定义
二维、表格型的数组结构,可存储许多不同类型的数据,且每个轴都有标签,可当作一个series的字典; - 关键点
- 异构数据;
- 大小可变;
- 数据可变;
- 功能特点
- 潜在的类是不同类型;
- 大小可变;
- 标记轴(行和列);
- 可对行和列执行算术运算;
Panel
- 定义
三维,大小可变的数组; - 关键点
- 异构数据;
- 大小可变;
- 数据可变;
三者区别与共性
- 可变性:三者的值都是值可变的,除了series都是大小可变的;
- 较高维数据结构是较低维数据结构的容器,Panel 是 DataFrame 的容器,DataFrame是 Series 的容器;
如何使用Pandas
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# @Time : 2018-12-15 14:29
# @Author : Cunyu
# @Site :
# @File : panda.py
# @Software: PyCharm
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 对象创建
seri = pd.Series([1,3,5,np.nan,9,10])
print(seri)
dates = pd.date_range('20181215', periods=10)
print(dates)
df = pd.DataFrame(np.random.randn(10,4), index=dates, columns=list('ABCD'))
print(df)
# 查看数据
print('All:\n', df.head())
print('前三行:\n', df.head(3))
print('后三行\n', df.tail(3))
print('index:\n',df.index)
print('col:\n', df.columns)
print('values:\n', df.values)
print('desc:\n', df.describe())
print('转置:\n', df.T)
print('sort by an axis:\n', df.sort_index(axis=1, ascending=False))
print('sort by values:\n', df.sort_values(by='B'))
# 获取,常用数据访问方法:.at, .iat, .loc, .iloc, .ix
print("df['A']:\n", df['A']) # 选择一列产生一个系列
print('df[0:3]:\n', df[0:3])
# 按标签选择
print(df.loc[dates[0]])
print(df.loc[:,['A','B']])
print('获取某一个特定值:\n', df.at[dates[0], 'A'])
# 通过位置选择
print('获取每个特定位置的值:\n', df.iloc[3])
print('切片操作:\n', df.iloc[3:5, 0:2])
print(df.iat[1,1])
# 布尔索引
print(df[df.A>0])
print('filter:\n', df.copy())
print('demo:\n', df[df['D'].isin(['two', 'four'])])
"""
Series
"""
# pandas.Series(data, index, dtype, copy),构造函数创建
# 创建一个空系列
print('Null Series:\n', pd.Series())
# 从ndarray创建一个系列
data = np.array(['a', 'b', 'c', 'd'])
print('ndarray Series:\n', pd.Series(data))
# 从字典创建一个系列
data = {'a':0, 'b':3, 'c':4}
print('dict Series:\n', pd.Series(dict))
# 从标量创建一个系列
print('scalar Series:\n', pd.Series(5, index=[1, 2, 4, 8, 0]))
# 从具有位置系列中访问数据
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print('Search :\n', s[:3])
# 使用标签检索数据
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print('s["d"]: ', s['d'])
# 属性或方法
# 1、axes,返回行轴标签列表
seri = pd.Series(np.random.randn(5))
print('axes:\n', seri.axes)
# 2、dtype,返回对象数据类型
print('dtype:\n', seri.dtype)
# 3、empty,若系列为空,返回True
print('empty:\n', seri.empty)
# 4、ndim,返回底层数据的维数
print('ndim:\n', seri.ndim)
# 5、size,返回基础数据中的元素数
print('size:\n', seri.size)
# 6、values,将系列作为ndarray返回
print('values:\n', seri.values)
# 7、head(n),返回前n行
print('head:\n', seri.head(3))
# 8、tail(n),返回后n行
print('tail:\n', seri.tail(3))
"""
DataFrame
"""
# pandas.DataFrame(data,index,columns,dtype,copy)
# 创建空DataFrame
print(pd.DataFrame())
# 从列表创建DataFrame
print('List DataFrame:\n', pd.DataFrame([1,3,5,7,9]))
# 从字典创建DataFrame
dict = {'name':['Manu', 'Tim', 'Paker'], 'age':[41, 42, 36]}
print('Dict DataFrame:\n', pd.DataFrame(dict))
# 从系列的字典创建DataFrame
dict_series = {'First' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'Second' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
print('Series DataFrame:\n', pd.DataFrame(dict_series))
# 列选择,列添加,列删除
df = pd.DataFrame(dict_series)
dict_series = {'First' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'Second' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
print('列选择:\n', pd.DataFrame(dict_series)['First'])
df['Third'] = pd.Series([11, 22, 44], index=['a', 'b', 'c'])
print('列添加:\n', df)
del df['First']
df.pop('Third')
print('列删除:\n', df)
# 属性或方法
dict = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
dataFrame = pd.DataFrame(dict)
# 1、axes,返回行轴标签列表
dataFrame = pd.DataFrame(np.random.randn(5))
print('axes:\n', dataFrame.axes)
# 2、dtypes,返回对象数据类型
print('dtype:\n', dataFrame.dtypes)
# 3、empty,若系列为空,返回True
print('empty:\n', dataFrame.empty)
# 4、ndim,返回底层数据的维数
print('ndim:\n', dataFrame.ndim)
# 5、size,返回基础数据中的元素数
print('size:\n', dataFrame.size)
# 6、values,将系列作为ndarray返回
print('values:\n', dataFrame.values)
# 7、head(n),返回前n行
print('head:\n', dataFrame.head(3))
# 8、tail(n),返回后n行
print('tail:\n', dataFrame.tail(3))
# 9、T,转置
print('T:\n', dataFrame.T)
# 10、shape,返回表示DataFrame的维度的元祖
print('shape:\n', dataFrame.shape)
"""
Panel
"""
# pandas.Panel(data,items,major_axis,minor_axis,dtype,copy)
# 创建面板
# 创建一个空面板
print('Null Panel:\n', pd.Panel())
# 从3D ndarray创建
data = np.random.rand(3, 4, 5)
print('3D narray:\n', pd.Panel(data))
# 从DataFrame对象的dict创建面板
data = {'Item1' : pd.DataFrame(np.random.randn(4, 4)),
'Item2' : pd.DataFrame(np.random.randn(4, 5))}
print('DataFrame的Dict:\n', pd.Panel(data))
"""
描述性统计
"""
dict = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])}
dataFrame = pd.DataFrame(dict)
# 求和
print('sum:\n', dataFrame.sum())
# 均值
print('avg:\n', dataFrame.mean())
# 标准差
print('std:\n', dataFrame.std())
# 非空观测数量
print('count:\n', dataFrame.count())
# 中位数
print('median:\n', dataFrame.median())
# 模值
print('mode:\n', dataFrame.mode())
# 累计总和
print('cumsum:\n', dataFrame.cumsum())
# 累计乘积
print('cumprod:\n', dataFrame['Age'].cumprod())
# 统计信息摘要
print('describe:\n', dataFrame.describe(include='all'))
"""
函数应用
"""
# 表格函数应用:pipe()
def adder(elem1, elem2):
return elem1+elem2
dataFrame = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
dataFrame.pipe(adder,10)
print('pipe:\n', dataFrame.pipe(adder,10))
# 行或列函数应用:apply()
print('apply:\n', dataFrame.apply(np.median))
# 元素函数应用:applymap()
print('map:\n', dataFrame['col1'].map(lambda x:x*100))
print('applymap:\n', dataFrame.apply(lambda x:x*100))
"""
重建索引
"""
df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])
# 重建索引与其他对象对齐,reindx_like,填充方法:pad/ffill-前向填充、bfill/backfill-向后填充值、nearest-从最近索引值填充
df1 = df1.reindex_like(df2)
print('reindex_like:\n', df1)
print('ffill:\n', df2.reindex_like(df1, method='ffill'))
# 重建索引时的填充限制
print('limit:\n', df2.reindex_like(df1, method='nearest', limit=2))
# 重命名
print('rename:\n', df1.rename(columns={'col1':'c1', 'col2':'c2'}))
"""
迭代
"""
SIZE=20
dataFrame = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=SIZE,freq='D'),
'x': np.linspace(0,stop=SIZE-1,num=SIZE),
'y': np.random.rand(SIZE),
'C': np.random.choice(['Low','Medium','High'],SIZE).tolist(),
'D': np.random.normal(100, 10, size=(SIZE)).tolist()
})
# iteritems(),每个列作为键,将值与值作为键和列值迭代为Series对象
print('iteritems:')
for key, value in dataFrame.iteritems():
print(key,value)
# iterrow(),返回迭代器,产生每个索引值及每行数据的序列
print('iterrow:')
dataFramea = pd.DataFrame(np.random.randn(5,3),columns = ['col1','col2','col3'])
for row_index, row in dataFrame.iterrows():
print(row_index, row)
# intertuples(),为DataFrame中的每一行返回一个产生一个命名元祖的迭代器,元祖的第一个元素将是行的相应索引值,剩余的值是行值
print('itertuples:')
for row in dataFrame.itertuples():
print(row)
"""
排序
"""
unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],
columns=['col2','col1'])
print(unsorted_df)
# sort_index(),按标签排序
print('sort_index:\n', unsorted_df.sort_index(ascending=False))
# sort_values,按值排序
print('sort_values:\n', unsorted_df.sort_values(by='col2'))
# 排序算法:mergesort(唯一稳定)、heapsort、quicksort
print('sort algorithm:\n', unsorted_df.sort_index(kind='heapsort'))
"""
字符串和文本数据
"""
# 1、lower() 将Series/Index中的字符串转换为小写。
# 2、upper() 将Series/Index中的字符串转换为大写。
# 3、len() 计算字符串长度。
# 4、strip() 帮助从两侧的系列/索引中的每个字符串中删除空格(包括换行符)。
# 5、split(' ') 用给定的模式拆分每个字符串。
# 6、cat(sep=' ') 使用给定的分隔符连接系列/索引元素。
# 7、get_dummies() 返回具有单热编码值的数据帧(DataFrame)。
strings = pd.Series(['Tim ', ' Rick', 'Joson', 'Albert'])
print ('get_dummies:\n', strings.str.get_dummies())
# 8、contains(pattern) 如果元素中包含子字符串,则返回每个元素的布尔值True,否则为False。
# 9、replace(a,b) 将值a替换为值b。
# 10、repeat(value) 重复每个元素指定的次数。
# 11、count(pattern) 返回模式中每个元素的出现总数。
# 12、startswith(pattern) 如果系列/索引中的元素以模式开始,则返回true。
# 13、endswith(pattern) 如果系列/索引中的元素以模式结束,则返回true。
# 14、find(pattern) 返回模式第一次出现的位置。
# 15、findall(pattern) 返回模式的所有出现的列表。
print('findall:\n', strings.str.findall('e'))
# 16、swapcase 变换字母大小写。
# 17、islower() 检查系列/索引中每个字符串中的所有字符是否小写,返回布尔值
# 18、isupper() 检查系列/索引中每个字符串中的所有字符是否大写,返回布尔值
# 19、isnumeric() 检查系列/索引中每个字符串中的所有字符是否为数字,返回布尔值。
print('isnumeric:\n', strings.str.isnumeric())
"""
选项和自定义
"""
# get_option(param),一个参数,获取属性值
print('display max rows:', pd.get_option('display.max_rows'))
print('display max columns:', pd.get_option('display.max_columns'))
# set_option(param, value),两个参数,将该值设置为指定的参数值
pd.set_option('display.max_rows', 90)
print('display max rows: ', pd.get_option('display.max_rows'))
# reset_option(param),接受一个参数,并将该值设置为默认值
pd.reset_option('display.max_rows')
print('display max rows: ', pd.get_option('display.max_rows'))
# describe_option(param),打印参数的描述
print('description:')
pd.describe_option('display.max_rows')
# option_context(),上下文管理器用于临时设置语句中的选项
print('option_context:')
with pd.option_context('display.max_rows', 10):
print(pd.get_option('display.max_rows')) # 最大行数
print(pd.get_option('display.max_columns')) # 最大列数
print(pd.get_option('display.max_colwidth')) # 最大列宽
print(pd.get_option('display.precision')) # 十进制的精度
print(pd.get_option('display.expand_frame_repr')) # 数据帧以拉伸页面
"""
索引与数据选择
"""
# 1、.loc(),基于标签
# 2、.iloc(),基于整数
# 3、.ix(),基于标签和数据
dataFrame = pd.DataFrame(np.random.randn(10, 4), columns = ['A', 'B', 'C', 'D'])
print(dataFrame.ix[:5])
"""
统计函数
"""
# pct_change(),将每个元素与前一个元素进行比较,并计算变化百分比
df = pd.DataFrame(np.random.randn(5, 2))
print ('pct_change:\n', df.pct_change())
# 协方差
seri1 = pd.Series(np.random.randn(10))
seri2 = pd.Series(np.random.randn(30))
print('cov:\n', seri1.cov(seri2))
# 相关性
frame = pd.DataFrame(np.random.randn(20, 5), columns=['a', 'b', 'c', 'd', 'e'])
print('相关性:\n', frame['a'].corr(frame['c']))
# 数据排名
s = pd.Series(np.random.np.random.randn(5), index=list('abcde'))
s['d'] = s['e']
print ('rank:\n', s.rank())
"""
合并/连接
"""
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
{'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
left_merge = pd.merge(left, right, on='subject_id', how='left')
right_merge = pd.merge(left, right, on='subject_id', how='right')
outer_merge = pd.merge(left, right, on='subject_id', how='outer')
inner_merge = pd.merge(left, right, on='subject_id', how='inner')
print('left:\t', left_merge)
print('right:\t', right_merge)
print('outer:\t', outer_merge)
print('inner:\t', inner_merge)
"""
级联
"""
# concat(objs, axis, join, join_axes, ignore_index)
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
str_concat = pd.concat([one,two], ignore_index=True)
print('级联:\n', str_concat)
""""
时间序列
"""
# 获取当前时间
print('time now:\n', pd.datetime.now())
# 创建时间戳
print('创建时间戳:\n', pd.Timestamp('2018-11-11'))
# 转换为时间戳
print('转换时间戳:\n', pd.to_datetime(['2018/11/23', '2010.12.31', None]))
# 改变时间频率
print('改变频率:\n', pd.date_range("12:00", "19:59", freq="H").time)
# 时间差
print('时间差:\n', pd.Timedelta('60 days 11 hours 33 minutes 30 seconds'))
"""
绘图
"""
df = pd.DataFrame(np.random.randn(10,5),index=pd.date_range('2018/12/16',
periods=10), columns=list('ABCDE'))
df.plot()
# 条形图
df.plot.bar()
# 直方图
df.plot.hist()
# 盒型图
df.boxplot()
plt.show()
""""
IO工具
"""
# pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',names=None, index_col=None, usecols=None)
# 读取文件
file = pd.read_csv('read.csv')
print(file)
how的参数
- left
使用左侧对象的键; - right
使用右侧对象的键; - outer
使用键的联合; - inner
使用键的交集
# --*--coding:utf-8--*--
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
{'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
left_merge = pd.merge(left, right, on='subject_id', how='left')
right_merge = pd.merge(left, right, on='subject_id', how='right')
outer_merge = pd.merge(left, right, on='subject_id', how='outer')
inner_merge = pd.merge(left, right, on='subject_id', how='inner')
print('left:\t', left_merge)
print('right:\t', right_merge)
print('outer:\t', outer_merge)
print('inner:\t', inner_merge)