熊猫-根据列中的排序顺序拆分数据帧

时间:2020-01-08 11:51:04

标签: python pandas dataframe

我有一个具有这种结构的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 questionthis,但是我事先不知道值/行的数量...我也已经检查了another question,所以我考虑使用用正则表达式拆分。但是我只知道序列会升序,不能保证这些值是连续的,所以它不能按预期工作。

这有可能实现吗?预先感谢您的帮助!

2 个答案:

答案 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.shiftSeries.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