我有一个具有这种结构的pandas数据框:
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拆分为两个新的df,在我的示例中为:
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 question和this,但是我事先不知道值/行的数量...我也已经检查了another question,所以我考虑使用用正则表达式拆分。但是我只知道序列会升序,不能保证这些值是连续的,所以它不能按预期工作。
这有可能实现吗?预先感谢您的帮助!
答案 0 :(得分:2)
您知道只有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
答案 1 :(得分:1)
使用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