工具使用篇——DataFrame易用与易错点总结
DataFrame易用与易错点总结
1、apply()函数的应用
def filterComeAndGo(line):
if line["dep_cty_chn_nm"]=="昆明":
return line["dpt_dt"]
else:
return line["arrv_dt"]
if __name__ == '__main__':
arriveData=service.getData("arraveData",startTime="2018-01-01 00:00:00",endTime="2018-01-02 00:00:00")
# myColumns=arriveData.columns.to_list()
# myColumns.append("timeFromHere")
# arriveData.columns=myColumns
# arriveData["timeFromHere"] =pd.Series([None for i in range(arriveData.shape[0])])
arriveData["timeFromHere"]=arriveData.apply(filterComeAndGo,axis = 1)
注意点:apply可以应用于一个DataFrame对象,也可以应用于一个Series对象,对于处理函数而言,都是将这部分的数据作为一个迭代器逐一的进行迭代处理。但是这个过程中需要注意一个参数,就是axis.对于Series而言是没有这个参数的,因为一定是行方向的逐一迭代。但是对于DataFrame的数据类型,就要注意是在行方向的逐一计算还是列方向的逐一计算,下面附上官网的例子
DataFrame中的apply的应用
>>> df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])
>>> df
A B
0 4 9
1 4 9
2 4 9
>>> df.apply(np.sqrt)
A B
0 2.0 3.0
1 2.0 3.0
2 2.0 3.0
>>> df.apply(np.sum, axis=0)
A 12
B 27
dtype: int64
>>> df.apply(np.sum, axis=1)
0 13
1 13
2 13
dtype: int64
>>> df.apply(lambda x: [1, 2], axis=1)
0 [1, 2]
1 [1, 2]
2 [1, 2]
dtype: object
>>> df.apply(lambda x: [1, 2], axis=1, result_type='expand')
0 1
0 1 2
1 1 2
2 1 2
>>> df.apply(lambda x: pd.Series([1, 2], index=['foo', 'bar']), axis=1)
foo bar
0 1 2
1 1 2
2 1 2
>>> df.apply(lambda x: [1, 2], axis=1, result_type='broadcast')
A B
0 1 2
1 1 2
2 1 2
附上官方文档地址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html#pandas.DataFrame.apply
Series中的apply的应用
>>> s = pd.Series([20, 21, 12],
... index=['London', 'New York', 'Helsinki'])
>>> s
London 20
New York 21
Helsinki 12
dtype: int64
>>> def square(x):
... return x ** 2
>>> s.apply(square)
London 400
New York 441
Helsinki 144
dtype: int64
>>> s.apply(lambda x: x ** 2)
London 400
New York 441
Helsinki 144
dtype: int64
>>> def subtract_custom_value(x, custom_value):
... return x - custom_value
>>> s.apply(subtract_custom_value, args=(5,))
London 15
New York 16
Helsinki 7
dtype: int64
>>> def add_custom_values(x, **kwargs):
... for month in kwargs:
... x += kwargs[month]
... return x
>>> s.apply(add_custom_values, june=30, july=20, august=25)
London 95
New York 96
Helsinki 87
dtype: int64
>>> s.apply(np.log)
London 2.995732
New York 3.044522
Helsinki 2.484907
dtype: float64
2、loc进行非空选择
由于各种各样的原因我们希望对DaraFrame的某些列进行非空的选择,其实就是去除一些空的数据样本,如果用loc进行实现的化,就又一个问题,空到底怎样表示?
我有一个数据集,叫arriveData中有这样的一列数叫dpt_dt,是一列时间数据,我想要把它中间的空值去掉。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C21T7ca2-1584712450404)(./images/DataFrame注意点小结/1.png)]
刚开始我的方法如下:
(1)
outOfHere=arriveData.loc[(arriveData["dep_cty_chn_nm"]=="昆明")&(arriveData.dpt_dt!=None)]
然后发现空数据并没有消失,接下来进行分析,判断字符串长度
(2)
outOfHere=arriveData.loc[(arriveData["dep_cty_chn_nm"]=="昆明")&(len(arriveData["dpt_dt"])!=0)]
失败!
我打印出来空数值的类型:
发现类型是NaT类型。换第三种方法:
(3)
outOfHere=arriveData.loc[(arriveData["dep_cty_chn_nm"]=="昆明")&(type(arriveData["dpt_dt"])!=pd.Nat)]
发现依然不好使,因为type(arriveData[“dpt_dt”])属于series.
经过查询发现了notnull()函数。因此产生下面的做法:
outOfHere=arriveData.loc[(arriveData["dep_cty_chn_nm"]=="昆明")&(arriveData.dpt_dt.notnull())]
成功!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xDJw8SUs-1584712450408)(./images/DataFrame注意点小结/2.png)]
3、排序之后重新索引
outTime=outOfHere.sort_values(by="dpt_dt").reset_index(drop=True)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9ez5Ec2-1584712450410)(./images/DataFrame注意点小结/3.png)]
上一篇: Windows系统自带图标位置
下一篇: Typora的一些快捷键操作