为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过使用特定值对行进行分组来拆分数据帧并创建子数据帧?

如何通过使用特定值对行进行分组来拆分数据帧并创建子数据帧?

ITMISS 2022-09-13 19:30:21
我有一个像波纹管一样的数据帧date,value2/10/19,342/11/19,342/12/19,342/13/19,342/14/19,342/15/19,342/16/19,342/17/19,02/18/19,02/19/19,02/20/19,222/21/19,222/22/19,222/23/19,222/24/19,02/25/19,02/26/19,02/27/19,02/28/19,13/1/19,23/2/19,23/3/19,13/4/19,03/5/19,03/6/19,03/7/19,33/8/19,33/9/19,33/10/19,0在每个间隔数据帧都有零值之后,我想以这种方式对行进行分组,如果零连续出现两次,它应该创建一个子数据帧并保存文件。Output:df1     2/17/19,0    2/18/19,0    2/19/19,0df2    2/24/19,0    2/25/19,0    2/26/19,0    2/27/19,0df3    3/4/19,0    3/5/19,0    3/6/19,0我尝试了很多方法来做到这一点,但它失败了。谢谢。
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

您可以尝试使用滚动:


def merge_intervals(intervals):

    sorted_intervals = sorted(intervals, key=lambda x: x[0])

    interval_index = 0

    #print(sorted_intervals)

    for  i in sorted_intervals:


        if i[0] > sorted_intervals[interval_index][1]:

            interval_index += 1

            sorted_intervals[interval_index] = i

        else:

            sorted_intervals[interval_index] = [sorted_intervals[interval_index][0], i[1]]

    #print(sorted_intervals)

    return sorted_intervals[:interval_index+1]


end_ids = df[df['value'].rolling(3).apply(lambda x: (x==0).all())==1].index


start_ids = end_ids-3


intervals = merge_intervals([*zip(starts_ids, end_ids)])


for i,interval in enumerate(intervals):

    df[interval[0]+1:interval[1]+1].to_csv('df_' + str(i) + '.csv')

不是最漂亮的代码,但它可以工作,合并函数在这里找到:在Python中合并重叠间隔


查看完整回答
反对 回复 2022-09-13
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

找到值等于零的位置,并取长度为 3 的滚动总和。找出滚动总和等于 3 的位置。结果将滞后 2 个空格,因此我们采用结果的 -1 平移和 -2 移位版本的结果的逻辑。or


mask = df['value'].eq(0).rolling(3).sum().eq(3)

mask |= mask.shift(-2) | mask.shift(-1)

为了得到组,我取逻辑否定的累积和。对于每个非零值,这将递增,并停滞在零处。但是,每组零将不同。在我使用 时,这并不重要,因为我将使用首字母来仅查看首先满足条件的行。groupbymask


但是,生成的组将是一组非连续的整数。因为我不喜欢这样,所以我曾经给这些组提供从零开始的唯一整数值。factorize


grp_masked = (~mask).cumsum()[mask].factorize()[0]

g = df[mask].groupby(grp_masked)

保存文件

for grp, d in g:

    d.to_csv(f'df_{grp}.csv', index=False)

创建词典

df_dict = {grp: d for grp, d in g}

这将显示原始数据帧以及显示我们计算的一些内容的其他列。


group_series = pd.Series(

    grp_masked, df.index[mask], pd.Int64Dtype()

)


df_ = df.assign(

    EqZero=df['value'].eq(0),

    Roll2=df['value'].eq(0).rolling(3).sum(),

    Is3=df['value'].eq(0).rolling(3).sum().eq(3),

    Shift=lambda d: d.Is3.shift(-2) | d.Is3.shift(-1),

    Mask=mask,

    PreGrp=(~mask).cumsum(),

    Grp=group_series

)

df_


       date  value  EqZero  Roll2    Is3  Shift   Mask  PreGrp   Grp

0   2/10/19     34   False    NaN  False  False  False       1  <NA>

1   2/11/19      0    True    NaN  False  False  False       2  <NA>

2   2/12/19      0    True    2.0  False  False  False       3  <NA>

3   2/13/19     34   False    2.0  False  False  False       4  <NA>

4   2/14/19     34   False    1.0  False  False  False       5  <NA>

5   2/15/19     34   False    0.0  False  False  False       6  <NA>

6   2/16/19     34   False    0.0  False  False  False       7  <NA>

7   2/17/19      0    True    1.0  False   True   True       7     0

8   2/18/19      0    True    2.0  False   True   True       7     0

9   2/19/19      0    True    3.0   True  False   True       7     0

10  2/20/19     22   False    2.0  False  False  False       8  <NA>

11  2/21/19     22   False    1.0  False  False  False       9  <NA>

12  2/22/19     22   False    0.0  False  False  False      10  <NA>

13  2/23/19     22   False    0.0  False  False  False      11  <NA>

14  2/24/19      0    True    1.0  False   True   True      11     1

15  2/25/19      0    True    2.0  False   True   True      11     1

16  2/26/19      0    True    3.0   True   True   True      11     1

17  2/27/19      0    True    3.0   True  False   True      11     1

18  2/28/19      1   False    2.0  False  False  False      12  <NA>

19   3/1/19      2   False    1.0  False  False  False      13  <NA>

20   3/2/19      2   False    0.0  False  False  False      14  <NA>

21   3/3/19      1   False    0.0  False  False  False      15  <NA>

22   3/4/19      0    True    1.0  False   True   True      15     2

23   3/5/19      0    True    2.0  False   True   True      15     2

24   3/6/19      0    True    3.0   True  False   True      15     2

25   3/7/19      3   False    2.0  False  False  False      16  <NA>

26   3/8/19      3   False    1.0  False  False  False      17  <NA>

27   3/9/19      3   False    0.0  False  False  False      18  <NA>

28  3/10/19      0    True    1.0  False  False  False      19  <NA>


查看完整回答
反对 回复 2022-09-13
  • 2 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号