【问题标题】:group the same consecutive values in pandas and store: values, indices, and column slices在 pandas 中对相同的连续值进行分组并存储:值、索引和列切片
【发布时间】:2018-07-04 20:55:23
【问题描述】:

我有一个数据框

import pandas as pd
import numpy as np
v1=list(np.random.rand(30))
v2=list(np.random.rand(30))
mydf=pd.DataFrame(data=zip(v1,v2),columns=['var1','var2'])

然后我对一些变量应用一些布尔条件

mydf['cond1']=mydf['var1']>0.2
mydf['cond2']=mydf['var1']>0.8


mydf['cond1']=
0 False
1 True
2 True
3 False
4 False
5 True
6 False
....

我想在“cond1”(或“cond2”)为 True 的块中分组,并为每个组存储:

  • 组的值:真/假

  • 块的开始和结束的索引:例如 1,2 5,5

  • var2 的 2 个值在起点和终点的索引处,

  • 所有var1 的值在开始索引和结束索引之间,作为一个可迭代的(np.array 列表)

这是返回值的一个示例:

summary=
'Start' 'End' 'Start_var2' 'End_var2' 'Value' 'var1'
 1        2    0.3217381    0.454543   True    [0.25,0.26]

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC,让我们试试这样的事情:

    mydf.groupby(mydf.cond1.diff().cumsum(), as_index=False)\
        .apply(lambda x: pd.Series([x.iloc[0].name,
                                    x.iloc[-1].name, 
                                    x.iloc[0]['var2'], 
                                    x.iloc[-1]['var2'], 
                                    x.iloc[0]['cond1'], 
                                    x.var1.tolist()],
                                    index=['Start','End','Start_var2',
                                           'End_var2','Value','var1']))
    

    输出:

       Start  End  Start_var2  End_var2  Value                                               var1
    0      1   13    0.580713  0.772878   True  [0.9080110836630401, 0.34879731608699105, 0.63...
    1     14   14    0.688374  0.688374  False                              [0.11739843719148924]
    2     15   15    0.204304  0.204304   True                               [0.3010533582011998]
    3     16   17    0.470689  0.808964  False         [0.14526373397045378, 0.09218609736837002]
    4     18   20    0.675035  0.087408   True  [0.6029321967069232, 0.3641874497564469, 0.564...
    5     21   21    0.346795  0.346795  False                               [0.1913357207205566]
    6     22   29    0.944366  0.845753   True  [0.6769058596527606, 0.2155054472756598, 0.278...
    

    【讨论】:

    • perfect.nice,紧凑且没有显式循环
    【解决方案2】:

    我认为你可以使用this SO answeri 给你组号,gindex 可以用来获取var 的值。

    v1=list(np.random.rand(30))
    v2=list(np.random.rand(30))
    df=pd.DataFrame(data=zip(v1,v2),columns=['var1','var2'])
    
    df['cond1']=df['var1']>0.2
    df['cond2']=df['var1']>0.8
    
    for i, g in df.groupby([(df['cond1'] != df['cond1'].shift()).cumsum()]):
        print (i)
        print (g)
        print (g['cond1'].tolist())
        print(g['cond1'].index[0])#can get var values from this
    

    【讨论】:

    • 非常接近。避免for循环的任何机会?它是一个很长的df
    • 我对此表示怀疑,groupby 返回一个您必须以某种方式解包的对象。虽然我不认为自己是专家。不过,回答链接问题的人可能会提供帮助。
    猜你喜欢
    • 2020-05-03
    • 2018-05-27
    • 1970-01-01
    • 2014-11-25
    • 2015-05-21
    • 2023-02-03
    • 1970-01-01
    • 2021-12-22
    • 2021-07-18
    相关资源
    最近更新 更多