【问题标题】:Advanced Cumulative Grouping in Pandas and PythonPandas 和 Python 中的高级累积分组
【发布时间】:2018-09-02 15:46:47
【问题描述】:

我有一个包含以下时间序列数据的数据框 df:

        a        b      sign
1    -0.066   19.514    -1
2     0.334   19.848     1
3     0.991   20.839     1
4      0.42   21.259     1
5       0.0   21.367     0
6     -0.57   20.797    -1
7    -0.294   20.503    -1
8     0.579   21.082     1
9     0.234   21.316     1
0    -0.954   20.362    -1

我目前正在使用以下累积分组魔法:

df2 = df.groupby((df["sign"] != df['sign'].shift()).cumsum(), as_index=False).agg({'sign': 'first', 'a': ['sum','count']})

产生以下输出(我调整了列标题):

    sign     asum   cnt   
0   -1.0    -0.209   1  
1    1.0     1.970   3  
2    0.0     0.000   1  
3   -1.0    -0.813   2  
4    1.0     0.755   2  
5   -1.0    -1.015   1  

到目前为止一切都很好,这很好地显示了正值和负值的运行。
但是,我不希望 0 符号作为单独的组,我希望它与 1 组或 -1 组相关联(取决于我的心情)。

那么最好的方法是什么?理想情况下,我需要输出是这样的(假设 0 组现在将成为 1 组的一部分):

    sign      a    cnt   
0   -1.0    -0.209  1   
1    1.0     1.970  4           
2   -1.0    -0.813  2   
3    1.0     0.755  2   
4   -1.0    -1.015  1   

【问题讨论】:

  • 好点!关于心情....假设我的心情目前是我的榜样,积极的。我希望我能从人们的建议中弄清楚如何自己将其转变为消极情绪。 :-) 但大脑导入可能是 v2。

标签: python pandas time-series pandas-groupby


【解决方案1】:

我不确定确切你要做什么,但这似乎实现了你想要做的事情:

# change mood to 'negative' when required...
mood = 'positive'

if mood=='positive':
    df['sign'].replace(0,1,inplace=True)
else:
    df['sign'].replace(0,-1,inplace=True)

然后,继续使用您上面的确切 groupby,最终得到您的目标输出(没有像您那样更改列名):

   sign      a      
  first    sum count
0    -1 -0.066     1
1     1  1.853     4
2    -1 -0.864     2
3     1  0.813     2
4    -1 -0.954     1

【讨论】:

  • 嗯,这绝对是实现这一目标的一种方法。我会考虑一下,看看这是否会破坏其他任何东西。似乎好得令人难以置信。让我们看看是否有人有纯粹的分组建议。
【解决方案2】:

为什么不直接将原始符号列中的所有 0 替换为 -1 或 1?那么之前与 0 组相关联的行将与 -1 或 1 组相关联。

要将它们更改为一个:

df.sign = df.sign.where(df.sign!=0, 1)

那么,

df.groupby((df["sign"] != df['sign'].shift()).cumsum(), as_index=False).agg({'sign': 'first', 'a': ['sum','count']})

将产生:

       a        sign
     sum count first
0 -0.066     1    -1
1  1.853     4     1
2 -0.864     2    -1
3  0.813     2     1
4 -0.954     1    -1

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 2021-06-15
    • 2017-05-16
    • 2017-01-05
    • 2013-02-12
    • 2018-02-28
    • 2016-07-26
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多