欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

工具使用篇——DataFrame易用与易错点总结

程序员文章站 2022-05-25 21:10:23
...

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)]