博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pandas 前后行操作
阅读量:6177 次
发布时间:2019-06-21

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

一、前后行满足条件

问题

各位老师好,我有一个dataframe

产品 数据1 数据2

A 1 2
B 4 5
C 6 3
我想找出比如这一行数据1>数据2 AND 数据1的上一行<数据2的上一行
例如上例子,6>3 AND 4<5 则输出 产品C
应该怎么写

回答

df = pa.DataFrame({'产品': ['A','B','C'],                   '数据1': [1, 4, 6],                   '数据2': [2, 5, 3]})df[(df['数据1'].shift(1) < df['数据2'].shift(1)) & (df['数据1'].shift(0) > df['数据2'].shift(0))]['产品']

说明

选择行的最快的方法不是遍历行。而是,创建一个mask(即,布尔数组),然后调用df[mask]选择。

这里有一个问题:如何动态表示dataframe中的当前行、前一行?答案是用shift。
shift(0):当前行
shift(1):前一行
shift(n):往前第n行

若要满足多个条件

逻辑与&:
mask = ((...) & (...))

逻辑或|:

mask = ((...) | (...))

逻辑非~:

mask = ~(...)

例如:

In [75]: df = pd.DataFrame({'A':range(5), 'B':range(10,20,2)})In [76]: dfOut[76]:    A   B0  0  101  1  122  2  143  3  164  4  18In [77]: mask = (df['A'].shift(1) + df['B'].shift(2) > 12)In [78]: maskOut[78]: 0    False1    False2    False3     True4     Truedtype: boolIn [79]: df[mask]Out[79]:    A   B3  3  164  4  18

二、前后行构造数据

问题

If I have the following dataframe:

date A B M S

20150101 8 7 7.5 0
20150101 10 9 9.5 -1
20150102 9 8 8.5 1
20150103 11 11 11 0
20150104 11 10 10.5 0
20150105 12 10 11 -1
...

If I want to create another column 'cost' by the following rules:

if S < 0, cost = (M-B).shift(1)*Sif S > 0, cost = (M-A).shift(1)*Sif S == 0, cost=0

currently, I am using the following function:

def cost(df):

if df[3]<0:
return np.roll((df[2]-df[1]),1)df[3]
elif df[3]>0:
return np.roll((df[2]-df[0]),1)
df[3]
else:
return 0
df['cost']=df.apply(cost,axis=0)

Is there any other way to do it? can I somehow use pandas shift function in user defined functions? thanks.

答案

import numpy as npimport pandas as pd df = pd.DataFrame({'date': ['20150101','20150102','20150103','20150104','20150105','20150106'],                   'A': [8,10,9,11,11,12],                   'B': [7,9,8,11,10,10],                   'M': [7.5,9.5,8.5,11,10.5,11],                   'S': [0,-1,1,0,0,-1]})df = df.reindex(columns=['date','A','B','M','S'])# 方法一df['cost'] = np.where(df['S'] < 0,                      np.roll((df['M']-df['B']), 1)*df['S'],                      np.where(df['S'] > 0,                               np.roll((df['M']-df['A']), 1)*df['S'],                               0)                     )            # 方法二M, A, B, S = [df[col] for col in 'MABS']conditions = [S < 0, S > 0]choices = [(M-B).shift(1)*S, (M-A).shift(1)*S]df['cost2'] = np.select(conditions, choices, default=0)print(df)

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

你可能感兴趣的文章
iOS ScrollView上的view添加悬停效果
查看>>
Spring与MQ整合简单例子
查看>>
Apache-shiro学习
查看>>
React-Redux源码分析
查看>>
页面传递参数问题
查看>>
PHP FPM源代码反刍品味之五:信号signal处理
查看>>
5G网速真的有理论上那么高吗?
查看>>
Set添加自定义方法对象如何保证唯一性
查看>>
站在巨人肩膀上的牛顿:Kubernetes和SAP Kyma
查看>>
技术工坊|浅谈区块链的Layer2扩展(北京)
查看>>
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
查看>>
Apache和PHP结合 及 Apache默认虚拟主机
查看>>
添加自定义监控项目配置邮件告警测试告警不发邮件的问题处理
查看>>
solidity智能合约的经典设计模式
查看>>
华为交换网络基础、基本配置、STP/RSTP
查看>>
SpringCloud 微服务 (十七) 容器部署 Docker
查看>>
不定项选择题
查看>>
netty 分析博客
查看>>
Spring Cloud构建微服务架构服务注册与发现
查看>>
BCGControlBar教程:如何将MFC控件的BCGControlBarBCGSuite添加到对话框中
查看>>