Как подразделить pandas DataFrame в зависимости от условия И индексов? - PullRequest
0 голосов
/ 10 марта 2020

Я хотел бы разделить эти pandas DataFrames на N под-DataFrames в соответствии со значением состояния.

        x      y  state
0   71.27  45.10      2
1   69.95  44.53      2
2   70.63  45.19      2
3   69.67  45.16      1
4   70.64  45.59      1
5   67.85  45.48      1
6   70.10  44.60      1
7   70.52  45.37      1
8   68.89  45.97      1
9   70.35  45.15      1
10  71.01  45.72      1
11  70.89  45.45      1
12  69.93  44.25      1
13  70.94  44.87      0
14  70.36  44.61      0
15  71.98  44.60      0
16  70.10  44.72      1
17  68.92  46.73      1
18  69.92  46.06      1
19  70.61  44.63      1
20  70.19  45.19      1
21  67.44  46.27      1

Я могу легко сгруппировать строки, имеющие одно и то же значение состояния:

df[df['state'] == 0]
        x      y  state
13  70.94  44.87      0
14  70.36  44.61      0
15  71.98  44.60      0
df[df['state'] == 1]
        x      y  state
3   69.67  45.16      1
4   70.64  45.59      1
5   67.85  45.48      1
6   70.10  44.60      1
7   70.52  45.37      1
8   68.89  45.97      1
9   70.35  45.15      1
10  71.01  45.72      1
11  70.89  45.45      1
12  69.93  44.25      1
16  70.10  44.72      1
17  68.92  46.73      1
18  69.92  46.06      1
19  70.61  44.63      1
20  70.19  45.19      1
21  67.44  46.27      1
df[df['state'] == 2]
       x      y  state
0  71.27  45.10      2
1  69.95  44.53      2
2  70.63  45.19      2

Однако я хотел бы снова разделить эти субкадры в зависимости от индексов. Например, здесь я бы хотел 2 отдельных субкадра для state==1 вместо 1:

3   69.67  45.16      1
4   70.64  45.59      1
5   67.85  45.48      1
6   70.10  44.60      1
7   70.52  45.37      1
8   68.89  45.97      1
9   70.35  45.15      1
10  71.01  45.72      1
11  70.89  45.45      1
12  69.93  44.25      1
16  70.10  44.72      1
17  68.92  46.73      1
18  69.92  46.06      1
19  70.61  44.63      1
20  70.19  45.19      1
21  67.44  46.27      1

Есть идеи?

1 Ответ

1 голос
/ 10 марта 2020

вы можете идентифицировать блоки всякий раз, когда есть разница в state. Затем вы можете группировать по блокам. Например

# print blocks to see
blocks = df['state'].diff().ne(0).cumsum()
# if `state` is not numeric type
# blocks = df['state'].ne(df['state'].shift()]).cumsum()

[d for _,d in df.groupby(blocks)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...