亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過使用特定值對行進行分組來拆分數據幀并創建子數據幀?

如何通過使用特定值對行進行分組來拆分數據幀并創建子數據幀?

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 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號