python разделить подмножество данных с условием от до - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть фрейм данных, и мне нужно разделить на подмножество с этими условиями:

начало разделения: c = 1 конец разделения: c = -1

пример:

 a         b    c
False   False   
False   False  -1 
False   False   
True    False   1  start first subset
False   False   
False   False   1
False   False   1
False   False   
False   False   1
False   False   
False   False   1
False   False   
False   True   -1 end of first subset
False   False   
False   False   
False   True   -1
False   False   
False   False   
True    False   1 start second subset
False   False  -1 end of second subset

1 Ответ

1 голос
/ 29 апреля 2020

Это может быть решением, хотя я не уверен, что это наиболее эффективный подход. Это в основном использует cumsum и некоторые и / или логики c.

import pandas as pd
import numpy as np

df = pd.DataFrame({'c': [np.nan, 1, np.nan, 1, np.nan, np.nan,
                         -1, np.nan, np.nan, 1, np.nan, np.nan,
                         1, 1, np.nan, -1, -1, 1, -1]})

      c
0   NaN
1   1.0
2   NaN
3   1.0
4   NaN
5   NaN
6  -1.0
7   NaN
8   NaN
9   1.0
10  NaN
11  NaN
12  1.0
13  1.0
14  NaN
15 -1.0
16 -1.0
17  1.0
18 -1.0

(
    df
    .assign(
    start_end=lambda df: df.index.isin(
        df
        .loc[lambda df: df.c.isin([1,-1])]
        .loc[lambda df: df.c.shift(1,fill_value=0)!=df.c]
        .index),
    start=lambda df: np.where(np.logical_and(df.start_end==True,df.c==1),1,0),
    end=lambda df: np.where(np.logical_and(df.start_end==True,df.c==-1),1,0),
    subset=lambda df: np.where(df.start.cumsum() != df.end.shift(1, fill_value=0).cumsum(),
                               df.start.cumsum(),
                               0)
    )
    .drop(columns=['start_end','start','end'])
)

      c  subset
0   NaN       0
1   1.0       1
2   NaN       1
3   1.0       1
4   NaN       1
5   NaN       1
6  -1.0       1
7   NaN       0
8   NaN       0
9   1.0       2
10  NaN       2
11  NaN       2
12  1.0       2
13  1.0       2
14  NaN       2
15 -1.0       2
16 -1.0       0
17  1.0       3
18 -1.0       3
```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...