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

2021年11月23日 阅读数:3
这篇文章主要向大家介绍pandas:对字符串类型作差分比较,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1. 问题需求

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

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

2. 预备知识

2.1 Series.ne(Series)ui

判断两个Series是否相等spa

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()code

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

2.3 DataFrame.bfill()字符串

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

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

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)进行差分比较,因此对于类别型变量的比较,能够采用下面方法:ast

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