博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python减法怎么办_Python数据偏移减法,上下两行减法,python,错位,相减
阅读量:5321 次
发布时间:2019-06-14

本文共 2387 字,大约阅读时间需要 7 分钟。

今天接到一个需求,要求用对数据进行

错位相减

。感觉写得有点麻烦,如果其他方法,欢迎留言交流

数据说明:有客户、消费日期、消费额度

求解目标:对于同一个客户,对日期升序排序,如果下一个日期的消费额度

大于

上一个日期的消费额度,则标记,最终取出第一次发生时对应的较大的日期

最简单的方法是使用

pandas.Series.shift

具体可参考官方文档

方法一是使用

pandas.Series.shift

,该方法可以方便地对数据进行移动

import pandas as pd

import numpy as np

df = pd.DataFrame({'persion':['A','A','A','A','B','B','B','B','B', 'C' ,'D','D','D']

, 'date':[0, 1, 6, 4, 1, 7, 4, 5, 6, 3, 1, 2, 3]

, 'price':[1, 5, 3, 0, 2, 4, 5, 8, 3, 5, 7, 7, 7 ]})

# 组内排序

df['sort_id'] = df['date'].groupby(df['persion']).rank()

df.sort_values(by = ['persion', 'sort_id'], axis=0, inplace=True)

df['price_y'] = df["price"].shift(1)

方法二是自己写的完整的数据处理方法,比较复杂,可作参考

import pandas as pd

import numpy as np

df = pd.DataFrame({'persion':['A','A','A','A','B','B','B','B','B', 'C' ,'D','D','D']

, 'date':[0, 1, 6, 4, 1, 7, 4, 5, 6, 3, 1, 2, 3]

, 'price':[1, 5, 3, 0, 2, 4, 5, 8, 3, 5, 7, 7, 7 ]})

# 组内排序

df['sort_id'] = df['date'].groupby(df['persion']).rank()

df.sort_values(by = ['persion', 'sort_id'], axis=0, inplace=True)

# 添加每个persion的记录数

persion_dt = df['persion']

persion_u = list(persion_dt.unique())

persion_cout = df['persion'].value_counts().to_dict()

persion_dt_dict = persion_dt.to_dict()

for key, value in persion_dt_dict.items():

persion_dt_dict[key] = persion_cout[value]

df['persion_cout'] = persion_dt_dict.values() # 添加每个id的统计值

# 数据移动,将下一条数据移动到上一行

fill_data = pd.DataFrame({'date':[0], 'price':[0]}) # 填充为0, 也可以是其他值

# df.loc[df['persion']==col_value, ['date', 'price']][1:].append(fill_data) 使移动后的数据行数与移动前一致

slice_data = {col_value: df.loc[df['persion']==col_value, ['date', 'price']][1:].append(fill_data) for col_value in persion_u }

new_data = pd.DataFrame()

for key, value in slice_data.items():

new_data = new_data.append(value)

new_data.reset_index(drop=True, inplace=True)

# 将移动后的数据与原数据拼接

all_data = pd.merge(df, new_data, how='inner', left_index=True, right_index=True)

all_data['diff'] = all_data['price_y'] - all_data['price_x']

# 如果persion只有一条记录,保留;如果每个月的price一样,则保留最早的记录

all_data['flag'] = (all_data['persion_cout']==1) | (all_data['diff']>=0)

all_data2 = all_data[all_data['flag'] == True]

data_select = all_data2.groupby('persion', as_index=False).first() # 保留第一次取得的最大值

# 将填充的0值改为有效值

data_select.loc[data_select['date_y']==0, 'date_y'] = data_select.loc[data_select['date_y']==0, 'date_x']

# 删除无用的列

data_select.drop(['sort_id', 'persion_cout', 'diff', 'flag'], axis=1, inplace=True)

转载地址:http://pshhv.baihongyu.com/

你可能感兴趣的文章
【luogu2678】【niop2015】跳石头 [二分]
查看>>
实验报告二
查看>>
input里面的submit鼠标按钮属性cursor
查看>>
gdb 调试coredump文件过程:
查看>>
javascript 向下拉列表框select添加选项option
查看>>
opencv学习之路(5)、鼠标和滑动条操作
查看>>
poj 3253(贪心)
查看>>
Invalid prop: type check failed for prop "maxlength". Expected Number, got String.
查看>>
ipfs私链服务
查看>>
C语言 · Sine之舞
查看>>
C语言 · 简单加法
查看>>
好用的在线Markdown编辑器
查看>>
camera 摄像机
查看>>
wtforms
查看>>
加载静态文件,父模板的继承和扩展
查看>>
struts2 日期类型问题
查看>>
javascript数据缓存策略之本地存储
查看>>
HTML5 API详解(1):fullscreen全屏模式
查看>>
AngularJs自定义指令详解(5) - link
查看>>
从“埋点技术已死?”开始说起
查看>>