前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas:对字符串类型做差分比较

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

作者头像
Bo_hemian
发布2020-09-09 17:12:15
1.1K0
发布2020-09-09 17:12:15
举报
文章被收录于专栏:machine_learningmachine_learning

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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 问题需求
  • 2. 预备知识
  • 3. 解决方法
  • 4. 例子
  • 5. 补充内容
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档