У меня есть пандас dataframe с такой структурой:

df
Val1 Val2 Col1 Col2
1    1    0    3
1    2    2    4
2    1    2    3
3    2    2    5
1    2    3    4
2    1    3    1
3    4    2    1

По сути, я заранее сортирую фрейм данных по значениям val1 и val2, поэтому я знаю, что впоследствии у меня будет две восходящие последовательности. Я хочу разделить этот df на два новых dfs в соответствии с двумя последовательностями, которые в моем примере были бы такими:

df1
Val1 Val2 Col1 Col2
1    1    0    3
1    2    2    4
2    1    2    3
3    2    2    5

df2
Val1 Val2 Col1 Col2
1    2    3    4
2    1    3    1
3    4    2    1

Я проверил этот вопрос и this, но я не знаю заранее количество значений / строк ... Я ' Мы также проверили еще один вопрос, поэтому я подумал об использовании разделения с регулярным выражением . Но я знаю только, что последовательности будут возрастать, нет гарантии, что значения будут непрерывными, поэтому это не работает должным образом.

Можно ли этого достичь? Я заранее ценю любую помощь!

0
xzxz 8 Янв 2020 в 14:51

2 ответа

Лучший ответ

Используя Series.shift и Series.cumsum:

m = df['Val1'].shift() > df['Val1']
dfs = [df for _, df in df.groupby(m.cumsum())]

Теперь у нас есть все df в списке, мы можем получить к ним доступ:

print(dfs[0])
print(dfs[1])

   Val1  Val2  Col1  Col2
0     1     1     0     3
1     1     2     2     4
2     2     1     2     3
3     3     2     2     5 

   Val1  Val2  Col1  Col2
4     1     2     3     4
5     2     1     3     1
6     3     4     2     1
1
Erfan 8 Янв 2020 в 12:14

Знаете ли вы, что будет только 2 последовательности? Если так:

mask = df.Val1 < df.Val1.shift(1)
change_point = mask[mask].index[0]
df1 = df[df.index < change_point]
df2 = df[df.index >= change_point].reset_index(drop=True)

Тогда df1 будет

   Val1  Val2  Col1  Col2
0     1     1     0     3
1     1     2     2     4
2     2     1     2     3
3     3     2     2     5

И df2

   Val1  Val2  Col1  Col2
0     1     2     3     4
1     2     1     3     1
2     3     4     2     1
2
ignoring_gravity 8 Янв 2020 в 12:03