作用 | 代码 |
---|---|
显示所有列 | pd.set_option(‘display.max_columns’, None) |
显示所有行 | pd.set_option(‘display.max_rows’, None) |
设置每行显示的长度 | pd.set_option(‘display.width’, 200) |
s = pd.Series(data, index=index)
其中 index 是一个列表,用来作为数据的标签。data 可以是不同的数据类型:Python 字典,ndarray 对象,一个标量值
note:
(2维的,就有行标签和列标签,支持自动索引对齐)
f = pd.DataFrame(data, index=index, columns=columns)
其中 index 是行标签,columns 是列标签,data 可以是下面的数据:
note:
dateframe会从data中自动搜索索引,若先前是有索引的,则在创建时会在指定的索引中寻找对应数据(索引对齐操作),不存在会用Nan填补
具体放法1:
dates=pd.date_range('20210101',periods=6)
datas=pd.DataFrame(np.random.random((6,4)),index=dates,columns=list('ABCD'))
d={
'A':0,'B':range(4),'C':pd.Timestamp('20210101')}
datas=pd.DataFrame(d)
Panel 是三维带标签的数组。实际上,Pandas 的名称由来就是由 Panel 演进的,即 pan(el)-da(ta)-s。Panel 比较少用,但依然是最重要的基础数据结构之一。
items: 坐标轴 0,索引对应的元素是一个 DataFrame
major_axis: 坐标轴 1, DataFrame 里的行标签
minor_axis: 坐标轴 2, DataFrame 里的列标签
df.assign(Ratio = df[‘A’] / df[‘B’]) #实际的df没有变,是通过复制返回了一个新的dataframe
列名=data的操作,可以是函数,例如df.assign(AB_Ratio = lambda x: x.A / x.B)
3. 给索引命名
对series:s.index.name = ‘alpha’
对dataframe:df.index.name=‘row’,df.columns.name=‘col’
查询索引的类
pd.*Index?
查询是否有重复的索引: s.index.is_unique
返回有索引唯一值的索引列表: s.index.unique()
可用grouby来根据具体需要处理重复索引,例如s.groupby(s.index).sum() #还有.mean()等等
可以使数据在一个轴上有多个索引级别。即可以用二维的数据表达更高维度的数据,使数据组织方式更清晰。它使用 pd.MultiIndex 类来表示。
df2 = df.swaplevel(‘row-1’, ‘row-2’)
df.sortlevel(0) #括号中的数字表示对几级索引进行排序
df.sum(level=0) #.sum表示使用的函数,level表示按照几级索引的值进行操作
df.set_index(‘c’) #将索引为c的这列设置层索引
df2.reset_index() #则将df的索引变为列名,索引变为默认的0,1,2…
df.query()
参数 | 说明 |
---|---|
expr | 要评估的查询字符串; 可以在环境中引用变量,在变量前面加上@字符(@a+b); 也可以通过在反引号中将空格或运算符括起来来引用它们 |
inplace=False | 查询是应该修改数据还是返回修改后的副本 |
df2 = df.drop([‘two’, ‘four’], axis=1) #返回一个丢弃[‘two’, ‘four’]两列的dataframe,axis默认是0.
apply: 这里有大佬的讲解连接:map、apply、applymap详解
(1). 将数据按行或列进行计算,默认axis=0是按列,设置axis=1可按行
(2). GroupBy 的 apply 函数对每个分组进行计算,
groupby(‘分组关键字’).apply(函数名,函数的参数1,函数的参数2,…)
下方示例为应用groupby,来用各分组的平均值去填充Nan
datas.sort_index(axis=1,ascending=False) #axis=1也课用‘columns’替换
axis=1对列标签,0对行标签,False降序,默认为True升序
datas.sort_values(by=‘A’,ascending=False)
对series进行排名,method='first’表示先出现的先排名,dataframe中类似,df.rank()
datas.loc[:,[‘B’,‘D’]]
datas.at[pd.Timestamp(‘20210101’),‘B’] #这里一定要写原先的数据结构
datas.iloc[:,[1,3]]
datas.iat[1,1]#直接写位置来访问
用标量可以把整个列(行)改成同一个值
datas.B=2
不是标量的话,长度一定要匹配
datas[datas.A>0.5]#若两个条件要分别括号括起来用&连接
datas[datas.tag.isin([‘a’,‘c’])]
df.dropna()
df.fillna(value=4)
pd.isnull(df)#以表格形式展现
pd.isnull(df).any()#以列形式展现
pd.isnull(df).any().any()
选出某属性缺失值对应的行
data.loc[(data.关注的属性.isnull()), '关注的属性']
note: 空数据是不参与运算的
按条件修改元素df.loc[‘属性’==条件,属性]=a
自动将序列扩充成和dataframe相同的列的表再相减
s=pd.Series(np.random.randint(1,10,size=10))
s.mode() #返回众数
s.value_counts() #返回计数
s.isin([1]) #判断值series是否在给定列表中
ps:
(df1==df.iloc[[0,1,3],:]).all()#按列看元素是否相同
(df1==df.iloc[[0,1,3],:]).all().all()
分组计算三步曲:拆分 -> 应用 -> 合并
三步 | 意义 |
---|---|
拆分 | 根据什么进行分组? |
应用 | 每个分组进行什么样的计算? |
合并 | 把每个分组的计算结果合并起来。 |
s.groupby([数组]) #返回的是按照数组里元素进行分组的groupby对象(,进一步用.sum()等操作,才返回series
将上图进行 .unstack() 可转换成dataframe
.groupby([数组]) #返回的是按照数组里元素进行分组的groupby对象,可进行迭代 ,从而可转换成很多类型
df.groupby([‘A’, ‘B’]).sum() #可以根据A,B顺序不同进行不同分组 .sum() 可换成有需要的函数,如.size(),.mean()
当函数作为分组依据时,数据表里的每个索引(可以是行索引,也可以是列索引)都会调用一次函数,函数的返回值作为分组的索引,即相同的返回值分在同一组。
例如,按搜索引的长度进行分组
df.groupby(level=‘country’, axis=1).count() # leve参数选择哪个索引进行分组,对列进行分组时,一定要写axis=1,否则会报错,因为默认是对行,此时行索引名不为country
pd.crosstab(df[‘属性1’],df['属性2’])即可做出对属性一为行索引,属性2为列索引,值为属性2出现的次数的表
stacked=df.stack()
stacked
#返回成原来的样子则stcaked.unstack()
unstacked=df.unstack()#转化一层索引到列索引
unstacked
#unstacked=df.unstack().unstack()是将所有索引转化到列索引
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])
#or
df.pivot_table(values='D', index=['A', 'B'], columns=['C'])
数据为D,index是将其作为行索引,columns是作为列索引
转换后的透视表缺失值显示NaN,多个值的时候显示平均值,也可以通过aggfunc='mean’来设置
时间日期
from datetime import datetime
from datetime import timedelta
now = datetime.now()
now
#datetime.datetime(2021, 2, 7, 10, 20, 37, 473245)
now.year, now.month, now.day, now.hour
#(2021, 2, 7, 10)
timedelta的参数可为days, seconds, microseconds, milliseconds, minutes, hours, weeks
也可用date.strftime(’%Y-%m-%d %H:%M:%S’) 导出我们想要格式化样式的字符串,小写y输出是两位数的年份
# 实例1:日期时间的字符串
pd.Timestamp('2019-01-01T12') # Timestamp('2019-01-01 12:00:00')
pd.Timestamp('2019-01-16 20:22:2')# Timestamp('2019-01-16 20:22:02')
# 实例2:以秒为单位转换表示Unix纪元的浮点数
pd.Timestamp(1513393355.5, unit='s')# Timestamp('2019-12-16 03:02:35.500000')
pd.Timestamp(1513393355, unit='s', tz='US/Pacific')#特定时区
# Timestamp('2019-12-15 19:02:35-0800', tz='US/Pacific')
#实例3:模仿datetime.datetime:通过位置或关键字,不能两者混合
pd.Timestamp(2019, 1, 16, 20,26,30) #Timestamp('2019-01-16 20:26:30')
pd.Timestamp(year=2019, month=1, day=16, hour=20,
minute=28, second=30, microsecond=30)#Timestamp('2019-01-16 20:28:30.000030')
pd.Period 表示时期(一段连续的时间),比如几日,月或几个月等。比如用来统计每个月的销售额,就可以用时期作为单位。
A-DEC: 以 12 月份作为结束的年时期
A-NOV: 以 11 月份作为结束的年时期
Q-DEC: 以 12 月份作为结束的季度时期
Pandas 支持 12 种季度型频率,从 Q-JAN 到 Q-DEC
step1: 生成一个时间戳的时间序列
\qquad ts = pd.Series(np.random.randn(5), index = pd.date_range(‘2016-12-29’, periods=5, freq=‘D’))
step2: ts .to_period() 默认以创建时间戳时的freq为频率转为相应的时期
step3: 时期转换为时间戳,细部时间会丢失
\qquad pts.to_timestamp(how=‘end’) #how参数设置缺失时间的填补
高频率 -> 低频率 -> 降采样:5 分钟股票交易数据转换为日交易数据
低频率 -> 高频率 -> 升采样
其他重采样:每周三 (W-WED) 转换为每周五 (W-FRI)
ts . resample (rule=‘2Min’, how=‘sum’, label=‘right’)
rule为新采样周期。
how采样样本值函数结果,sum表示采样周期中的值求和,ohlc表示open,high,low,close,其他常用的值由:‘first’、‘last’、‘median’、‘max’、‘min’。
label表示哪一侧时间为行索引left是开始时间,right表示结束时间 。
以周为单位,每周五采样
df = pd.DataFrame(np.random.randint(1, 50, 2), index=pd.date_range(‘2016-04-22’, periods=2, freq=‘W-FRI’))
df.resample(‘D’),以天采样,缺失值自动用Nan填补
df.resample(‘D’, fill_method=‘ffill’, limit=3) #fill_method缺失值填补的方式,lim表示每次插值最多的量。
这里从‘W-FRI’到’W-MON’,一定要写fill_method,不然会显示NaN
df = pd.read_csv(‘data/002001.csv’, index_col=‘Date’)#这样读出的索引类型是object
df = pd.read_csv(‘data/002001.csv’, index_col=‘Date’, parse_dates=True)#添加上参数parse_dates=True,日期索引就会变为python日期的类型
(ps:也可以直接parse_dates=[‘列名称’]指定该列为日期类型)
讲索引日期转化后就可用时间序列的方法处理,例如
df = pd.DataFrame({“id”:[1,2,3,4,5,6], “raw_grade”:[‘a’, ‘b’, ‘b’, ‘a’, ‘a’, ‘e’]})
for col in columns[:-1]: #'需要编码的索引列位置'
t = pd.get_dummies(data[col])
t = t.rename(columns=lambda x: col+'_'+str(x)) #给重编码的列重命名,默认是列的不同属性名
x = pd.concat((x, t), axis=1)
Pandas 的数据可视化使用 matplotlib 为基础组件。
%matplotlib inline #将图片画在jupyter的网页里
import pandas as pd
import numpy as np
ts.plot(title=‘cumsum’, style=‘r-’, ylim=[-30, 30], figsize=(4, 3));
图 | 代码 |
---|---|
折线图 | ts.plot() |
饼图 | ts.plot.pie() |
直方图 | ts.plot.hist() |
柱状图 | ts.plot(kind=‘bar’) |
密度图 | ts.plot.kde() |
参数 | 示例 | 意义 |
---|---|---|
subplot | subplot=True | 以多个子图的形式展示数据 |
xshare.yshare | xshare=True | 表示共享x轴 |
grid | grid=True | 表示带网格 |
fontsize | fontsize=20 | 字体大小为20 |
figsize | figsize=(6, 6) | 图片大小为6*6 |
df.plot(title=‘DataFrame cumsum’, figsize=(4, 12), subplots=True, sharex=True, sharey=True);
stacked=True
df.plot.pie(labels=[‘AA’, ‘BB’, ‘CC’, ‘DD’], colors=[‘r’, ‘g’, ‘b’, ‘c’],autopct=’%.2f’, fontsize=20, figsize=(6, 6))
%more 文件名.文件格式 # 可查看文件内容
需要指定分隔符,分隔符可为正则表达式,如sep=’\s+'表示多个空格,可以解决空格数量不一致导致数据不能很好划分的问题
tr = pd.read_csv(‘data/ex6.csv’, chunksize=1000)
chunksize表示每次读的行数,整个返回的是一个解析器支持迭代
df.to_csv(‘data/ex5_out.csv’, index=False)
Pandas 与 numpy 在核心数据结构上是完全兼容的