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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM