一、前后行满足条件

问题

各位老师好,我有一个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]: df
Out[76]:
A B
0 0 10
1 1 12
2 2 14
3 3 16
4 4 18 In [77]: mask = (df['A'].shift(1) + df['B'].shift(2) > 12) In [78]: mask
Out[78]:
0 False
1 False
2 False
3 True
4 True
dtype: bool In [79]: df[mask]
Out[79]:
A B
3 3 16
4 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)*S
if S > 0, cost = (M-A).shift(1)*S
if 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 np
import 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)

pandas 前后行操作的更多相关文章

  1. pandas DataFrame行或列的删除方法

    pandas DataFrame的增删查改总结系列文章: pandas DaFrame的创建方法 pandas DataFrame的查询方法 pandas DataFrame行或列的删除方法 pand ...

  2. Pandas的基础操作(一)——矩阵表的创建及其属性

    Pandas的基础操作(一)——矩阵表的创建及其属性 (注:记得在文件开头导入import numpy as np以及import pandas as pd) import pandas as pd ...

  3. python数据结构:pandas(2)数据操作

    一.Pandas的数据操作 0.DataFrame的数据结构 1.Series索引操作 (0)Series class Series(base.IndexOpsMixin, generic.NDFra ...

  4. Pandas的拼接操作

    pandas的拼接操作 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join import pandas as pd import n ...

  5. (四)pandas的拼接操作

    pandas的拼接操作 #重点 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 0. 回顾numpy的级联 import num ...

  6. 数据分析05 /pandas的高级操作

    数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...

  7. 命令行操作svn和git和git

    前几天在写代码的时候电脑突然坏掉,老大交代的任务没完成,非常痛恨自己用svn或者git保存代码,相信很多程序员遇到过,硬盘坏掉,存在硬盘中的代码丢失,无法找回的问题,svn和git可谓程序员界的福音, ...

  8. mysql 命令行操作入门(详细讲解版)

    之前分享过多次Mysql主题,今天继续分享mysql命令行入门   1. 那么多mysql客户端工具,为何要分享命令行操作? -快捷.简单.方便 -在没有客户端的情况下怎么办 -如果是mysql未开启 ...

  9. Git基本命令行操作 (转)

    Git远程操作详解   作者: 阮一峰 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和 ...

随机推荐

  1. iOS--UISearchBar和UISearchDisplayController

    UISearchBar继承自UIView.UIResponder.NSObject 属性: autocapitalizationType————自动对输入文本对象进行大小写设置(包含4种类型,但是有时 ...

  2. 【转】一个非常常见但容易被忽略的c++问题——用IPML模式可以解决

    pimpl (the pointer-to-implementation idiom)手法在 C++ 里已是“高手”们广泛运用的成熟方法之一,它的优点很多,诸如降低编译依赖.提高重编译速度之类的工具性 ...

  3. java实现栈和队列

    class Node { int val; Node next; Node(int x) { val = x; next = null; } } class Stack { Node top; pub ...

  4. iOS中倒计时

    方法一:使用NSTimer来实现(比较适用于发送短信验证码倒计时) 主要是利用NSTimer的scheduledTimerWithTimeInterval方法来每秒执行一次changeTime方法 / ...

  5. [转]Linux下的Makefile

    Makefile 介绍——————— make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序. 首先,我们用一个示例来说明Makefile的书写规则.以便 ...

  6. 使用百度出品的 uaredirect.js 来判断客户端是否为手机

    目前一般的网站都分成了PC版和手机版,当访问的浏览器是来自PC版时,则让其访问PC版的网页,当访问的浏览器是来自手机时,则让其跳转到手机版的地址.百度的uaredirect.js 就是一个小小的工具, ...

  7. Python pip – error: invalid command ‘bdist_wheel’

    原文@http://software-engineer.gatsbylee.com/python-pip-error-invalid-command-bdist_wheel/ Python pip – ...

  8. 一个fork的面试题

    前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下.这个题是这样的: 题目:请问下面的程序一共输出多 ...

  9. virtualbox 在window10上的兼容性调整

    更新完windows10后,打开当时的virtualbox 4.3.3已经是最新的啦,打开原来安装的几个虚拟机(hadoop),发现均失败. 打开setting一看,网络一栏有问题,桥接模式的虚拟机都 ...

  10. Bash Shell read file line by line and substring

    #read one file line by line for line in $(cat test1.txt); do echo $line ; done; #while read split li ...