pandas 前后行操作
一、前后行满足条件
问题:
各位老师好,我有一个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 前后行操作的更多相关文章
- pandas DataFrame行或列的删除方法
pandas DataFrame的增删查改总结系列文章: pandas DaFrame的创建方法 pandas DataFrame的查询方法 pandas DataFrame行或列的删除方法 pand ...
- Pandas的基础操作(一)——矩阵表的创建及其属性
Pandas的基础操作(一)——矩阵表的创建及其属性 (注:记得在文件开头导入import numpy as np以及import pandas as pd) import pandas as pd ...
- python数据结构:pandas(2)数据操作
一.Pandas的数据操作 0.DataFrame的数据结构 1.Series索引操作 (0)Series class Series(base.IndexOpsMixin, generic.NDFra ...
- Pandas的拼接操作
pandas的拼接操作 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join import pandas as pd import n ...
- (四)pandas的拼接操作
pandas的拼接操作 #重点 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 0. 回顾numpy的级联 import num ...
- 数据分析05 /pandas的高级操作
数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...
- 命令行操作svn和git和git
前几天在写代码的时候电脑突然坏掉,老大交代的任务没完成,非常痛恨自己用svn或者git保存代码,相信很多程序员遇到过,硬盘坏掉,存在硬盘中的代码丢失,无法找回的问题,svn和git可谓程序员界的福音, ...
- mysql 命令行操作入门(详细讲解版)
之前分享过多次Mysql主题,今天继续分享mysql命令行入门 1. 那么多mysql客户端工具,为何要分享命令行操作? -快捷.简单.方便 -在没有客户端的情况下怎么办 -如果是mysql未开启 ...
- Git基本命令行操作 (转)
Git远程操作详解 作者: 阮一峰 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和 ...
随机推荐
- iOS--UISearchBar和UISearchDisplayController
UISearchBar继承自UIView.UIResponder.NSObject 属性: autocapitalizationType————自动对输入文本对象进行大小写设置(包含4种类型,但是有时 ...
- 【转】一个非常常见但容易被忽略的c++问题——用IPML模式可以解决
pimpl (the pointer-to-implementation idiom)手法在 C++ 里已是“高手”们广泛运用的成熟方法之一,它的优点很多,诸如降低编译依赖.提高重编译速度之类的工具性 ...
- java实现栈和队列
class Node { int val; Node next; Node(int x) { val = x; next = null; } } class Stack { Node top; pub ...
- iOS中倒计时
方法一:使用NSTimer来实现(比较适用于发送短信验证码倒计时) 主要是利用NSTimer的scheduledTimerWithTimeInterval方法来每秒执行一次changeTime方法 / ...
- [转]Linux下的Makefile
Makefile 介绍——————— make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序. 首先,我们用一个示例来说明Makefile的书写规则.以便 ...
- 使用百度出品的 uaredirect.js 来判断客户端是否为手机
目前一般的网站都分成了PC版和手机版,当访问的浏览器是来自PC版时,则让其访问PC版的网页,当访问的浏览器是来自手机时,则让其跳转到手机版的地址.百度的uaredirect.js 就是一个小小的工具, ...
- Python pip – error: invalid command ‘bdist_wheel’
原文@http://software-engineer.gatsbylee.com/python-pip-error-invalid-command-bdist_wheel/ Python pip – ...
- 一个fork的面试题
前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下.这个题是这样的: 题目:请问下面的程序一共输出多 ...
- virtualbox 在window10上的兼容性调整
更新完windows10后,打开当时的virtualbox 4.3.3已经是最新的啦,打开原来安装的几个虚拟机(hadoop),发现均失败. 打开setting一看,网络一栏有问题,桥接模式的虚拟机都 ...
- 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 ...