• pandas:对字符串类型做差分比较


    1. 问题需求

    某种行为最常发生时段、最少发生时段与X天前是否一致

    需求变形:判断上下行数据是否一致

    2. 预备知识

    2.1 Series.ne(Series)

    判断两个Series是否相等

    import pandas as pd
    import numpy as np
    
    a = pd.Series([1, 1, 1, np.nan], index=['a', 'b', 'c', 'd'])
    b = pd.Series([1, np.nan, 1, np.nan], index=['a', 'b', 'd', 'e'])
    
    a
    a    1.0
    b    1.0
    c    1.0
    d    NaN
    
    b
    a    1.0
    b    NaN
    d    1.0
    e    NaN
    
     a.ne(b)
    a    False
    b     True
    c    False
    d     True
    
     a.ne(b).astype(int)
    a    0
    b    1
    c    0
    d    1

    2.2 DataFrame.shift()

    按行或列移动,默认向下按行移动。

    2.3 DataFrame.bfill()

    用下一个非缺失值填充该缺失值。

    等价 DataFrame.fillna(method='bfill'),也等价于 ’!= ‘,但 ’!=‘耗时较慢,所以不推荐使用。

    df = pd.DataFrame(np.arange(16).reshape(4,4),columns=['AA','BB','CC','DD'],index =['a','b','c','d'])
    
    df
       AA  BB  CC  DD
    a   0   1   2   3
    b   4   5   6   7
    c   8   9  10  11
    d  12  13  14  15
    
    df.shift()
        AA   BB    CC    DD
    a  NaN  NaN   NaN   NaN
    b  0.0  1.0   2.0   3.0
    c  4.0  5.0   6.0   7.0
    d  8.0  9.0  10.0  11.0
    
    df.shift().bfill()
        AA   BB    CC    DD
    a  0.0  1.0   2.0   3.0
    b  0.0  1.0   2.0   3.0
    c  4.0  5.0   6.0   7.0
    d  8.0  9.0  10.0  11.0

    3. 解决方法

    由于 diff()只能对非字符串类型(numerical、datetimes)进行差分比较,所以对于类别型变量的比较,可以采用下面方法:

    df['changed'] = df['column'].ne(df['coluimn'].shift().bfill()).astype(int)

    4. 例子

    ColumnA   ColumnB
    1            Blue
    2            Blue
    3            Red
    4            Red
    5            Yellow
    df['changed'] = df['ColumnB'].ne(df['ColumnB'].shift().bfill()).astype(int)
    ColumnA   ColumnB      changed
    1            Blue         0
    2            Blue         0
    3            Red          1
    4            Red          0
    5            Yellow       1

    5. 补充内容

    对以下操作的耗时进行比较:
    %timeit df['ColumnB'].ne(df['ColumnB'].shift().bfill()).astype(int)
    10 loops, best of 3: 38.1 ms per loop
    
    %timeit (df.ColumnB != df.ColumnB.shift()).astype(int)
    10 loops, best of 3: 77.7 ms per loop
    
    %timeit df['ColumnB'] == df['ColumnB'].shift(1).fillna(df['ColumnB'])
    10 loops, best of 3: 99.6 ms per loop
    
    %timeit (df.ColumnB.ne(df.ColumnB.shift())).astype(int)
    10 loops, best of 3: 19.3 ms per loop


  • 相关阅读:
    C# using 实现强制资源清理
    MySQL workbench How to create a new model
    无法启动windows audio服务,错误提示126.
    Process of knowledge discovery in databases
    Android 应用程序中资源的引用
    Javadoc使用方法
    Android xml 布局
    load data with matlab
    Android中string.xml使用总结
    Introduction to Indigo
  • 原文地址:https://www.cnblogs.com/wkang/p/9771422.html
Copyright © 2020-2023  润新知