自学内容网 自学内容网

Pandas常用数据类型

扩展库pandas常用的数据结构如下:

(1)Series:带标签的一维数组

(2)DatetimeIndes:时间序列

(3)DateFrame:带标签且大小可变的二维表格结构

(4)Panel:带标签且大小可变的三维数组

1 一维数组与常用操作

Series由索引和值两部分组成,是一个类似于字典的结构。其中值的类型可以不同,如果在创建时没有明确指定索引,则会自动使用从0开始的非负整数作为索引。

import pandas as pd
import matplotlib.pyplot as plt

# 设置输出结果列对齐
pd.set_option('display.unicode.ambiguous_as_wide',True)
pd.set_option('display.unicode.east_asian_width',True)

# 自动创建从0开始的非负整数索引
s1=pd.Series(range(1,20,5))
# 使用字典创建Series,使用字典的“键”作为索引
s2=pd.Series({'语文':90,'数学':92,'Python':98,'物理':87,'化学':92})
# 修改指定索引对应的值
s1[3]=-17
s2['语文']=94

print('s1原始数据'.ljust(20,'='))
print(s1,'\n')
print('对s1所有数据求绝对值'.ljust(20,'='))
print(abs(s1),'\n')
print('s1的每行索引前面加上数字2'.ljust(20,'='))
print(s1.add_prefix(2),'\n')

print('s2原始数据'.ljust(20,'='))
print(s2,'\n')
print('s2数据的直方图'.ljust(20,'='))
s2.hist()
plt.show()
print('s2的每行索引后面加上_张三'.ljust(20,'='))
print(s2.add_suffix('_张三'),'\n')
print('s2最大值的索引'.ljust(20,'='))
print(s2.idxmax(),'\n')
print('测试s2的值是否在指定区间内'.ljust(20,'='))
print(s2.between(90,94,inclusive=True),'\n')
print('查看s2中90分以上的数据'.ljust(20,'='))
print(s2[s2>90],'\n')
print('查看s2中大于中值的数据'.ljust(20,'='))
print(s2[s2>s2.median()],'\n')
print('s2与数字之间的运算'.ljust(20,'='))
print(round((s2**0.5)*10,1),'\n')
print('s2中最小的2个值'.ljust(20,'\n'))
print(s2.nsmallest(2),'\n')

# 两个等长Series对象之间可以进行四则运算和幂运算
# 只对两个Series对象中都有的索引对应的值进行计算
# 非共同索引对应的值为空值
print('两个Series对象相加'.ljust(20,'='))
print(pd.Series(range(5))+pd.Series(range(5,10)),'\n')

# pipe()方法可以实现函数链式调用的功能
print('每个值加3之后再乘以3'.ljust(20,'='))
print(pd.Series(range(5)).pipe(lambda x:x+3).pipe(lambda x:x*3),'\n')
print('每个值的平方对5的余数'.ljust(20,'='))
print(pd.Series(range(5)).pipe(lambda x,y,z:(x**y)%z,2,5),'\n')

# apply()方法用来对Series对象的值进行函数运算
print('每个值加3'.ljust(20,'='))
print(pd.Series(range(5)).apply(lambda x:x+3),'\n')

print('标准差、无偏方差、无偏标准差'.ljust(20,'='))
print(pd.Series(range(5)).std(),'\n')
print(pd.Series(range(5)).var(),'\n')
print(pd.Series(range(5)).sem(),'\n')

print('检查是否存在等价于True的值'.ljust(20,'='))
print(any(pd.Series([3,0,True])),'\n')

print('查看是否所有值都等价于True'.ljust(20,'='))
print(all(pd.Series([3,0,True])))

2 时间序列与常用操作

使用pandas的date_range()函数生成时间序列对象:

date_range(start=None,end=None,periods=None,freq='D',tz=None,normalize=False,name=None,closed=None,**kwargs)

(1)start和end用来指定起止日期时间

(2)periods用来指定要生成的数据数量

(3)freq用来指定时间间隔,默认为'D',表示相邻两个日期之间相差一天

另外,pandas的Timestamp类也支持很多与日期时间有关的操作

import pandas as pd

# start指定起日期,end指定结束日期,periods指定生成的数据数量
# freq指定时间间隔,D表示天,W表示周,H表示小时
# M表示月末最后一天,MS表示月初第一天
# T表示分钟,Y表示年末最后一天,YS表示年初第一天
print('间隔5天'.ljust(30,'='))
print(pd.date_range(start='20190601',end='20190630',freq='5D'),'\n')

print('间隔1周'.ljust(30,'='))
print(pd.date_range(start='20190601',end='20190630',freq='W'),'\n')

print('间隔2天,5个数据'.ljust(30,'='))
print(pd.date_range(start='20190601',periods=5,freq='2D'),'\n')

print('间隔3小时,8个数据'.ljust(30,'='))
print(pd.date_range(start='20190601',periods=8,freq='3H'),'\n')

print('3:00开始,间隔1分钟,12个数据'.ljust(30,'='))
print(pd.date_range(start='201906010300',periods=12,freq='T'),'\n')

print('间隔1月,月末最后一天'.ljust(30,'='))
print(pd.date_range(start='20190101',end='20191231',freq='M'),'\n')

print('间隔1年,6个数据,年末最后一天'.ljust(30,'='))
print(pd.date_range(start='20190101',periods=6,freq='Y'),'\n')

print('间隔1年,6个数据,年初第1天'.ljust(30,'='))
print(pd.date_range(start='20190101',periods=6,freq='YS'),'\n')

# 使用日期时间做索引,创建Series对象
data=pd.Series(index=pd.date_range(start='20190701',periods=24,freq='H'),data=range(24))
print('前5条数据'.ljust(30,'='))
print(data[:5],'\n')

print('3小时重采样,计算均值'.ljust(30,'='))
print(data.resample('3H').mean(),'\n')

print('5小时重采样,求和'.ljust(30,'='))
print(data.resample('5H').sum(),'\n')

# OHLC分别表示OPEN、HIGH、LOW、CLOSE
print('5小时重采样,统计OHLC值'.ljust(30,'='))
print(data.resample('5H').ohlc(),'\n')

print('所有日期替换为第2天'.ljust(30,'='))
data.index=data.index+pd.Timedelta('1D')
print(data[:5],'\n')

print('查看指定日期是周几'.ljust(30,'='))
print(pd.Timestamp('20190323').day_name(),'\n')

print('查看指定日期时间所在年是否为闰年'.ljust(30,'='))
print(pd.Timestamp('20190930').is_leap_year,'\n')

print('查看指定日期所在的季度和月份'.ljust(30,'='))
day=pd.Timestamp('20191025')
print(day.quarter,day.month,'\n')

print('转换为Python的日期时间对象'.ljust(30,'='))
print(day.to_pydatetime())

3 二维数组DataFrame

每个DataFrame对象可以看作一个二维表格,由索引(index)、列名(columns)、值(values)三部分组成。

import numpy as np
import pandas as pd

# 设置输出结果列对齐
pd.set_option('display.unicode.ambiguous_as_wide',True)
pd.set_option('display.unicode.east_asian_width',True)

# 在[1,20]区间上生成5行3列15个随机数
# 使用index参数指定索引,columns参数指定每列标题
df=pd.DataFrame(np.random.randint(1,20,(5,3)),index=range(5),columns=['A','B','C'])
print(df,'\n')

print('='*20)
# 模拟2019年7月15日某超市熟食、化妆品、日用品每小时的销量
# 使用时间序列作为索引
df=pd.DataFrame(np.random.randint(5,15,(13,3)),index=pd.date_range(start='201907150900',end='201907152100',freq='H'),columns=['熟食','化妆品','日用品'])
print(df,'\n')

print('='*20)
# 模拟考试成绩,使用人名字符串作为索引
df=pd.DataFrame({'语文':[87,79,67,92],'数学':[93,89,80,77],'英语':[90,80,70,75]},index=['张三','李四','王五','赵六'])
print(df,'\n')

print('='*20)
# 自动对B列数据进行扩充,使其与A列数据一样多
df=pd.DataFrame({'A':range(5,10),'B':3})
print(df)

原文地址:https://blog.csdn.net/2302_80828325/article/details/145115602

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!