Pandas自定义shift与DataFrame求差集的小技巧

目录
  • Pandas的高级shift偏移
  • Datafream对象求差集
  • 总结

大家好,我是小小明。今天分享两个小技巧:

Pandas的高级shift偏移

有很多玩量化的朋友经常碰到类似这样的问题:

其中有位量化大佬居然在半年后的今天又问了我一遍怎么实现这样的效果,他居然忘了我之前给他写过实现。为了避免有人再碰到类似的问题,特别写下此文。

我们知道Pandas默认的API是不支持这样的操作的,这个只能自己想办法实现。下面我借助数值索引实现这样的功能,并封装起来。

最终我们封装的方法如下:

import numpy as np
import pandas as pd

def adv_shift(s, n, na_value=pd.NA):
    t = np.arange(s.shape[0])-n
    t[t < 0] = s.shape[0]
    tmp = s.append(pd.Series(na_value))
    return pd.Series(tmp.iloc[t].values, index=s.index)

然后生成测试数据完成这个需求:

df = pd.DataFrame({"a": [200, 300, 500, 800, 600], "b": [1, 1, 1, 2, 1]})
df['c'] = df.a-adv_shift(df.a, df.b, 0)
df
  a b c
0 200 1 200
1 300 1 100
2 500 1 200
3 800 2 500
4 600 1 -200

可以看到结果完全满足要求。

如果你希望直接给DataFrame对象增加高级偏移adv_shift方法,则可以这样写:

def adv_shift(self, field, n, na_value=pd.NA):
    t = np.arange(self.shape[0])-self[n]
    s = self[field]
    t[t < 0] = s.shape[0]
    tmp = s.append(pd.Series(na_value))
    return pd.Series(tmp.iloc[t].values, index=s.index)

pd.DataFrame.adv_shift = adv_shift

调用方式:

df['c'] = df.a-df.adv_shift("a", "b", 0)
df
  a b c
0 200 1 200
1 300 1 100
2 500 1 200
3 800 2 500
4 600 1 -200

最终结果与上述一致。

Datafream对象求差集

下面我们再看看如何求解Datafream对象的交集、并集和差集:

import pandas as pd

df1 = pd.DataFrame([[1, 11], [2, 22], [3, 33]],
                   columns=['a', 'b'])
df2 = pd.DataFrame([[0, 0], [1, 11], [2, 22], [4, 44]], columns=['a', 'b'])
display(df1)
display(df2)

交集和并集一般的实现都是使用merge方法。

取交集:

df1.merge(df2)

去并集:

df1.merge(df2, how='outer')

关于取差集,我采用的是去重法。思路是,将df1与df2拼接,然后将重复的都去掉不保留,为了将df2全部去掉,将df2拼接两次,这样所有df2的数据都会产生重新而被删除,df1存在于与df2一致的数据也会被删除。

代码为:

pd.concat([df1, df2, df2]).drop_duplicates(keep=False)

测试结果:

总结

到此这篇关于Pandas自定义shift与DataFrame求差集的文章就介绍到这了,更多相关Pandas shift与DataFrame求差集内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pandas DataFrame.shift()函数的具体使用

    pandas DataFrame.shift()函数可以把数据移动指定的位数 period参数指定移动的步幅,可以为正为负.axis指定移动的轴,1为行,0为列. eg: 有这样一个DataFrame数据: import pandas as pd data1 = pd.DataFrame({ 'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'b': [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] }) print data1 a b 0 0 9 1 1 8

  • pandas DataFrame的修改方法(值、列、索引)

    对于DataFrame的修改操作其实有很多,不单单是某个部分的值的修改,还有一些索引的修改.列名的修改,类型修改等等.我们仅选取部分进行介绍. 一.值的修改 DataFrame的修改方法,其实前面介绍loc方法的时候介绍了一些. 1. loc方法修改 loc方法实际上是定位某个位置的数据的,但是定位完以后就可以对此位置的数据进行修改,使用此方法可以对DataFrame进行的修改如下: 1.对某行.某N行进行修改: 2.对某列.某N列进行修改: 3.对横坐标为某行或某N行,纵坐标为某列或者某N列的

  • 利用Pandas 创建空的DataFrame方法

    平时写pyhton的时候习惯初始化一些list啊,tuple啊,dict啊这样的.一用到Pandas的DataFrame数据结构也就总想着初始化一个空的DataFrame,虽然没什么太大的用处,不过还是记录一下: # 创建一个空的 DataFrame df_empty = pd.DataFrame(columns=['A', 'B', 'C', 'D']) 上面创建的DataFrame有4列,每一行没有成员是空的. 输出一下结果: Empty DataFrame Columns: [A, B,

  • Pandas DataFrame数据的更改、插入新增的列和行的方法

    一.更改DataFrame的某些值 1.更改DataFrame中的数据,原理是将这部分数据提取出来,重新赋值为新的数据. 2.需要注意的是,数据更改直接针对DataFrame原数据更改,操作无法撤销,如果做出更改,需要对更改条件做确认或对数据进行备份. 代码: import pandas as pd df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['

  • pandas DataFrame 删除重复的行的实现方法

    1. 建立一个DataFrame C=pd.DataFrame({'a':['dog']*3+['fish']*3+['dog'],'b':[10,10,12,12,14,14,10]}) 2. 判断是否有重复项 用duplicated( )函数判断 C.duplicated() 3.  有重复项,则可以用drop_duplicates()移除重复项 C.drop_duplicates() 4. Duplicated( )和drop_duplicates( )方法是以默认的方式判断全部的列(上面

  • Pandas自定义shift与DataFrame求差集的小技巧

    目录 Pandas的高级shift偏移 Datafream对象求差集 总结 大家好,我是小小明.今天分享两个小技巧: Pandas的高级shift偏移 有很多玩量化的朋友经常碰到类似这样的问题: 其中有位量化大佬居然在半年后的今天又问了我一遍怎么实现这样的效果,他居然忘了我之前给他写过实现.为了避免有人再碰到类似的问题,特别写下此文. 我们知道Pandas默认的API是不支持这样的操作的,这个只能自己想办法实现.下面我借助数值索引实现这样的功能,并封装起来. 最终我们封装的方法如下: impor

  • Pandas DataFrame求差集的示例代码

    在Pandas中 求差集没有专门的函数.处理办法就是将两个DataFrame追加合并,然后去重. divident.append(hasThisYearDivident) noHasThisYearDivident = divident.drop_duplicates(subset='ts_code', keep=False, inplace=True, ignore_index=True) 具体函数用法: https://pandas.pydata.org/pandas-docs/stable

  • 详解利用Pandas求解两个DataFrame的差集,交集,并集

    目录 模拟数据 差集 方法1:concat + drop_duplicates 方法2:append + drop_duplicates 交集 方法1:merge 方法2:concat + duplicated + loc 方法3:concat + groupby + query 并集 方法1:concat + drop_duplicates 方法2:append + drop_duplicates 方法3:merge 大家好,我是Peter~ 本文讲解的是如何利用Pandas函数求解两个Dat

  • WordPress中自定义后台管理界面配色方案的小技巧

    WordPress 3.8 开始的全新设计的后台支持多颜色选择,默认有八种非常精美的配色,可以让用户自己选择. 关于配色 WordPress 提供了一个函数 wp_admin_css_color() 可以让开发者自定义配色,只需要调用一下这个函数即可完成所有的注册操作. 参数 wp_admin_css_color( $key, $name, $url, $colors = array(), $icons = array() ); $key(string):颜色的 ID $name(string)

  • Python Dataframe 指定多列去重、求差集的方法

    1)去重 指定多列去重,这是在dataframe没有独一无二的字段作为PK(主键)时,需要指定多个字段一起作为该行的PK,在这种情况下对整体数据进行去重. Attention:主要用到了drop_duplicates方法,并设置参数subset为多个字段名构成的数组. 具体代码如下: >>>import pandas as pd >>>data={'state':[1,1,2,2,1,2,2],'pop':['a','b','c','d','b','c','d']} &

  • Pandas中两个dataframe的交集和差集的示例代码

    创建测试数据: import pandas as pd import numpy as np #Create a DataFrame df1 = { 'Subject':['semester1','semester2','semester3','semester4','semester1', 'semester2','semester3'], 'Score':[62,47,55,74,31,77,85]} df2 = { 'Subject':['semester1','semester2','s

  • Python pandas自定义函数的使用方法示例

    本文实例讲述了Python pandas自定义函数的使用方法.分享给大家供大家参考,具体如下: 自定义函数的使用 import numpy as np import pandas as pd # todo 将自定义的函数作用到dataframe的行和列 或者Serise的行上 ser1 = pd.Series(np.random.randint(-10,10,5),index=list('abcde')) df1 = pd.DataFrame(np.random.randint(-10,10,(

  • pandas数据预处理之dataframe的groupby操作方法

    在数据预处理过程中可能会遇到这样的问题,如下图:数据中某一个key有多组数据,如何分别对每个key进行相同的运算? dataframe里面给出了一个group by的一个操作,对于"group by"操作,我们通常是指以下一个或多个操作步骤: l (Splitting)按照一些规则将数据分为不同的组: l (Applying)对于每组数据分别执行一个函数: l (Combining)将结果组合到一个数据结构中: 使用dataframe实现groupby的用法: # -*- coding

  • 浅谈pandas中shift和diff函数关系

    通过?pandas.DataFrame.shift命令查看帮助文档 Signature: pandas.DataFrame.shift(self, periods=1, freq=None, axis=0) Docstring: Shift index by desired number of periods with an optional time freq 该函数主要的功能就是使数据框中的数据移动,若freq=None时,根据axis的设置,行索引数据保持不变,列索引数据可以在行上上下移动

  • python DataFrame 取差集实例

    需求:给定一个dataframe和一个list,list中存放的是dataframe中某一列的元素,删除dataframe中与list元素重复的行(即取差集). 在网上搜了一圈,好像没看到DataFrame中取差集的方式,所以自己写了一个.方法比较繁琐,如果有更简便的方式,请留言. import pandas as pd data = [[1,2,3],[2,3,4],[3,4,5],[4,5,6]] # 创建dataframe,包含a,b,c三列 df = pd.DataFrame(data,

随机推荐