pandas__0">pandas 数据结构
Series
- Series是一种类似于一维数组的对象,它由一组数据(不同数据类型)以及一组与之相关的数据标签(即索引)组成。
列表创建
-
仅有数据列表即可产生最简单的Series
s1 = pd.Series([1,'a',5.2,7]) '''左侧为索引,右侧是数据''' s1"""输出如下""" 0 1 1 a 2 5.2 3 7 dtype: object
获取索引
'''获取索引''' s1.index"""输出如下""" RangeIndex(start=0, stop=4, step=1)
获取数据
''' 获取数据''' s1.values"""输出如下""" array([1, 'a', 5.2, 7], dtype=object)
创建标签索引
-
创建一个具有标签索引的Series
s2 = pd.Series([1, 'a', 5.2, 7], index=['d','b','a','c']) s2"""输出如下""" d 1 b a a 5.2 c 7 dtype: object
获取索引:
s2.index"""输出如下""" Index(['d', 'b', 'a', 'c'], dtype='object')
字典创建
-
使用Python字典创建Series
sdata={'Ohio':35000,'Texas':72000,'Oregon':16000,'Utah':5000} s3=pd.Series(sdata) s3"""输出如下""" Ohio 35000 Texas 72000 Oregon 16000 Utah 5000 dtype: int64
根据标签索引查询数据
-
类似Python的字典dict
s2"""输出如下""" d 1 b a a 5.2 c 7 dtype: object
s2['a']"""输出如下""" 5.2
type(s2['a'])"""输出如下""" float
s2[['b','a']]"""输出如下""" b a a 5.2 dtype: object
type(s2[['b','a']])"""输出如下""" pandas.core.series.Series
DataFrame
-
DataFrame
是一个表格型的数据结构-
每列可以是不同的值类型(数值、字符串、布尔值等)
-
既有行索引index,也有列索引columns
-
可以被看做由Series组成的字典
创建dataframe最常用的方法,见02节读取纯文本文件、excel、mysql数据库
-
多个字典创建
-
根据多个字典序列创建dataframe
data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]} df = pd.DataFrame(data) df
每一列的数据类型
# 每一列的数据类型 df.dtypes"""输出如下""" state object year int64 pop float64 dtype: object
查看所有的列名
# 查看所有的列名(特征名称、或者理解为列的索引) df.columns """输出如下""" Index(['state', 'year', 'pop'], dtype='object')
查看行索引
# 查看行索引 df.index """输出如下""" RangeIndex(start=0, stop=5, step=1
从DataFrame中查询出Series
-
从DataFrame中查询出Series
- 如果只查询一行、一列,返回的是pd.Series
- 如果查询多行、多列,返回的是pd.DataFrame
df
查询多列
-
查询多列,结果是一个pd.DataFrame
df[['year', 'pop']] """输出如下"""
type(df[['year', 'pop']])"""输出如下""" pandas.core.frame.DataFram
查询一行
-
查询一行,结果是一个
pd.Series
df.loc[1]"""输出如下""" state Ohio year 2001 pop 1.7 Name: 1, dtype: object
type(df.loc[1])"""输出如下""" pandas.core.series.Series
查询多行
-
查询多行,结果是一个
pd.DataFrame
查询第2-4行
df.loc[1:3]"""输出如下"""
type(df.loc[1:3])"""输出如下""" pandas.core.frame.DataFrame
三、Pandas查询数据
-
Pandas查询数据的几种方法
1. `df.loc`方法,根据行、列的标签值查询 2. `df.iloc`方法,根据行、列的数字位置查询 3. `df.where`方法 4. `df.query`方法
.loc
既能查询,又能覆盖写入,强烈推荐! -
Pandas
使用df.loc
查询数据的方法- 使用单个label值查询数据
- 使用值列表批量查询
- 使用数值区间进行范围查询
- 使用条件表达式查询
- 调用函数查询
-
注意
- 以上查询方法,既适用于行,也适用于列
- 注意观察降维
dataFrame
>Series
>值
print(pd.__version__)1.1.5
读取数据
-
数据为北京2018年全年天气预报
df = pd.read_csv("./datas/beijing_tianqi/beijing_tianqi_2018.csv") df.head()
设定索引为日期
# 设定索引为日期,方便按日期筛选 df.set_index('ymd', inplace=True)
# 时间序列见后续,本次按字符串处理 df.index"""输出如下""" Index(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05','2018-01-06', '2018-01-07', '2018-01-08', '2018-01-09', '2018-01-10',...'2018-12-22', '2018-12-23', '2018-12-24', '2018-12-25', '2018-12-26','2018-12-27', '2018-12-28', '2018-12-29', '2018-12-30', '2018-12-31'],dtype='object', name='ymd', length=365)
替换掉温度的后缀
# 替换掉温度的后缀℃ df.loc[:,'bWendu'] = df['bWendu'].str.replace('℃',"").astype('int32') df.loc[:,'yWendu'] = df['yWendu'].str.replace('℃',"").astype('int32')df.dtypes"""输出如下""" bWendu int32 yWendu int32 tianqi object fengxiang object fengli object aqi int64 aqiInfo object aqiLevel int64 dtype: object
df.head() """输出如下"""
查询数据
单个label
-
使用单个label值查询数据
-
行或者列,都可以只传入单个值,实现精确匹配
得到单个值 (2018年1月3日的最高温度)
# 得到单个值 (2018年1月3日的最高温度) df.loc['2018-01-03', 'bWendu']"""输出如下""" 2
得到一个Series(2018年1月3日的最高温度和最低温度)
# 得到一个Series(2018年1月3日的最高温度和最低温度) df.loc['2018-01-03',['bWendu','yWendu']]"""输出如下""" bWendu 2 yWendu -5 Name: 2018-01-03, dtype: object
批量查询
-
使用值列表批量查询
得到Series:18年1月3,4,5日的最高温度
# 得到Series df.loc[['2018-01-03','2018-01-04','2018-01-05'], 'bWendu']"""输出如下""" ymd 2018-01-03 2 2018-01-04 0 2018-01-05 3 Name: bWendu, dtype: int32
得到DataFrame:18年1月3,4,5日的最高温度和最低温度
# 得到DataFrame df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']]"""输出如下"""
范围查询
-
使用数值区间进行范围查询
注意:区间既包含开始,也包含结束
行index按区间 (2018年1月3日至5号的最高温度和最低温度)
# 行index按区间 (2018年1月3日至5号的最高温度和最低温度)(series) df.loc['2018-01-03':'2018-01-05', 'bWendu']"""输出如下""" ymd 2018-01-03 2 2018-01-04 0 2018-01-05 3 Name: bWendu, dtype: int32
列index按区间
# 列index按区间(series) df.loc['2018-01-03', 'bWendu':'fengxiang']"""输出如下""" bWendu 2 yWendu -5 tianqi 多云 fengxiang 北风 Name: 2018-01-03, dtype: object
行和列都按区间查询
# 行和列都按区间查询(DataFrame) df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']"""输出如下"""
使用条件表达式查询
- bool列表的长度得等于行数或者列数
简单条件查询
-
简单条件查询,最低温度低于-10度的列表
df.loc[df['yWendu']<-10,:]"""输出如下"""
观察一下这里的boolean条件
# 观察一下这里的boolean条件 df['yWendu']<-10"""输出如下"""ymd 2018-01-01 False 2018-01-02 False 2018-01-03 False 2018-01-04 False 2018-01-05 False... 2018-12-27 True 2018-12-28 True 2018-12-29 True 2018-12-30 True 2018-12-31 False Name: yWendu, Length: 365, dtype: bool
复杂条件查询
-
复杂条件查询,查一下完美天气
注意,组合条件用&符号合并,每个条件判断都得带括号
查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据 df.loc[(df['bWendu']<=30) & (df['yWendu']>15)&(df["tianqi"]=='晴') & (df["aqiLevel"]==1),:]"""输出如下"""
再次观察这里的boolean条件
# 再次观察这里的boolean条件 (df['bWendu']<=30) & (df['yWendu']>15)&(df["tianqi"]=='晴') & (df["aqiLevel"]==1)"""输出如下""" ymd 2018-01-01 False 2018-01-02 False 2018-01-03 False 2018-01-04 False 2018-01-05 False... 2018-12-27 False 2018-12-28 False 2018-12-29 False 2018-12-30 False 2018-12-31 False Length: 365, dtype: bool
调用函数查询
lambda表达式
-
直接写lambda表达式
# 直接写lambda表达式 df.loc[lambda df : (df["bWendu"]<=30) & (df["yWendu"]>=15), :]"""输出如下"""
编写函数
-
自己编写函数
# 编写自己的函数,查询9月份,空气质量好的数据 def query_my_data(df):return df.index.str.startswith("2018-9") & (df["aqiLevel"]==1)df.loc[query_my_data, :]"""输出如下"""