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
