Pythonic计算pandas数据帧条纹的方法

Pythonic计算pandas数据帧条纹的方法,第1张

概述给定df df = pd.DataFrame([[1, 5, 2, 8, 2], [2, 4, 4, 20, 2], [3, 3, 1, 20, 2], [4, 2, 2, 1, 3], [5, 1, 4, -5, -4], [1, 5, 2, 2, -20], [2, 4, 4, 3, -8], [3, 3, 1, -1, -1], [4, 2, 2, 0, 12] 给定df
df = pd.DataFrame([[1,5,2,8,2],[2,4,20,[3,3,1,[4,3],[5,-5,-4],[1,-20],-8],-1,-1],12],-2]],columns=['A','B','C','D','E'],index=[1,6,7,9,10])

基于this answer,我创建了一个计算条纹(向上,向下)的函数.

def streaks(df,column):    #Create sign column    df['sign'] = 0    df.loc[df[column] > 0,'sign'] = 1    df.loc[df[column] < 0,'sign'] = 0    # Downstreak    df['d_streak2'] = (df['sign'] == 0).cumsum()    df['cumsum'] = np.nan    df.loc[df['sign'] == 1,'cumsum'] = df['d_streak2']    df['cumsum'] = df['cumsum'].fillna(method='ffill')    df['cumsum'] = df['cumsum'].fillna(0)    df['d_streak'] = df['d_streak2'] - df['cumsum']    df.drop(['d_streak2','cumsum'],axis=1,inplace=True)    # Upstreak    df['u_streak2'] = (df['sign'] == 1).cumsum()    df['cumsum'] = np.nan    df.loc[df['sign'] == 0,'cumsum'] = df['u_streak2']    df['cumsum'] = df['cumsum'].fillna(method='ffill')    df['cumsum'] = df['cumsum'].fillna(0)    df['u_streak'] = df['u_streak2'] - df['cumsum']    df.drop(['u_streak2',inplace=True)    del df['sign']    return df

功能很好,但很长.我确信写这个有更好的方法.我尝试了另一个答案,但效果不佳.

这是所需的输出

streaks(df,'E')    A   B   C    D     E    d_streak    u_streak1   1   5   2    8     2         0.0    1.02   2   4   4   20     2         0.0    2.03   3   3   1   20     2         0.0    3.04   4   2   2    1     3         0.0    4.05   5   1   4   -5    -4         1.0    0.06   1   5   2    2   -20         2.0    0.07   2   4   4    3    -8         3.0    0.08   3   3   1   -1    -1         4.0    0.09   4   2   2    0    12         0.0    1.010  5   1   4   20    -2         1.0    0.0
解决方法 您可以简化功能,如下所示:
def streaks(df,col):    sign = np.sign(df[col])    s = sign.groupby((sign!=sign.shift()).cumsum()).cumsum()    return df.assign(u_streak=s.where(s>0,0.0),d_streak=s.where(s<0,0.0).abs())

使用它:

streaks(df,'E')

首先,使用np.sign计算所考虑的列中存在的每个单元的符号.这些将1分配给正数,将-1分配给负数.

接下来,使用sign!= sign.shift()来识别相邻值的集合(比较当前单元格和它的下一个)并获取它将在分组过程中使用的累积和.

执行groupby,将这些作为键/条件,并再次获取子组元素的累积和.

最后,将正计算的cumsum值分配给ustreak,将负的值(取其模数后的绝对值)分配给dstreak.

总结

以上是内存溢出为你收集整理的Pythonic计算pandas数据帧条纹的方法全部内容,希望文章能够帮你解决Pythonic计算pandas数据帧条纹的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存