python数据分析之pandas(3)
前言
今天来说说pandas的一些数据结构,主要是一些查询方法,包括loc、iloc、where、query等方法,本人最喜欢的查询方式是iloc,它是根据索引来进行的查询。但是loc既能查询,也能够覆盖写入,也是一个很棒的方法,而它主要是根据标签来查询的。
开始
读取数据
和往常一样,我们需要先读取数据,然后才能对数据进行操作和分析
df = pd.read_csv("../pandas/ant-learn-pandas-master/datas/beijing_tianqi/beijing_tianqi_2018.csv")
数据读取完毕后,就开始我们今天的学习。之前提及了一下loc方法既能查询数据,还可以覆盖写入,现在就来展示一下吧。
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
先解释一下这个语句的功能,这两个语句主要是把bWendu和yWendu两列的“℃”这个单位去掉,用replace方法实现。然后顺便将它们的格式转换为“int32”类型。这里要注意以下的是“str”这个方法,它只能对字符串使用,不能对别的类型进行操作,不然会报错。
接下来对 loc() 方法进行一下解释,它可以输入两个参数,第一个参数是index(即行标签),第二个参数是column(即列标签)。可以进行精准定位,同时也可以通过切片进行多行查找。接下来就展示一下吧,它神奇的用法。
使用单个label值查询数据
df.loc['2018-01-03', 'bWendu'] # 得到单个值,两个参数都是单个数据,即为精准查找,返回一个值。
2
df.loc['2018-01-03', ['bWendu', 'yWendu']] # 如果有一个参数为多个数据,得到一个Series
bWendu 2
yWendu -5
loc通过输入行和列的标签,进行不同的查询,而它返回的结果根据它的参数不同而返回不同的类型。都为一个查询参数,则返回一个精确的值,至多一个参数有多个查询参数,则返回一个series。而iloc则是输入索引号,简单来说就是数字,就和数组的查询一样,上面的查询如果换成iloc方法则是:
df.iloc[2, 0]
df.iloc[2, [0, 1]]
它们返回的结果一样。
使用值列表批量查询
除了进行单个查找,还可以进行批量处理,同时输入多个查询参数或者使用切片参数。
df.loc[['2018-01-03','2018-01-04','2018-01-05'], 'bWendu'] # 得到Series
ymd
2018-01-03 2
2018-01-04 0
2018-01-05 3
df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']] # 得到DataFrame
bWendu yWendu
ymd
2018-01-03 2 -5
2018-01-04 0 -8
2018-01-05 3 -6
上面讲到了一个参数有多个查询值,如果两个参数都有多个查询值,就会返回一个表格类型。我们通过python提供的切片能够实现更加简单的操作,可以将上述代码简化为:
# 行index按区间
df.loc['2018-01-03':'2018-01-05', 'bWendu']
# 列index按区间
df.loc['2018-01-03', 'bWendu':'fengxiang']
# 行和列都按区间查询
df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']
这些都是loc方法能够进行的操作,单个查询,批量查询,区间查询,我们能够很方便的分析我们需要的数据。而iloc方法则是将loc中的标签换成索引号,同时loc的操作iloc同样的具有。
使用条件表达式查询
df.loc[df["yWendu"]<-10, :] #返回数据
df["yWendu"]<-10 # 观察一下这里的boolean条件,返回True或False
查询“yWendu”小于-10的所有数据,就是检测每行"yWendu"是否小于-10,则如果是则df[“yWendu”]<-10返回True,就会输出这一行。
复杂条件查询
## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.loc[(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1), :]
这个和上面的一样,只是加了联合查询,通过多个条件约束进行查询,本质都是一样的。我们还可以将后面的条件换成lambda表达式或者自己编写一个约束函数。可以自己多尝试一下。
结尾
希望指出不足,共同探讨,共同进步,感谢观看。