【问题标题】:Pandas - split dataframe according to sorted sequence in columnsPandas - 根据列中的排序顺序拆分数据帧
【发布时间】:2020-04-25 22:55:05
【问题描述】:

我有一个具有这种结构的 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,所以我考虑使用带有正则表达式的拆分。但是我只知道序列会升序,不能保证值是连续的,所以它不能按预期工作。

这有可能实现吗?我提前感谢任何帮助!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你知道只有 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】:

      使用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
      

      【讨论】:

      • 只是为了好玩我正在尝试d=dict([*df.groupby(m.cumsum())]) (:
      • 不错,目前不在我的笔记本电脑上,稍后再试。 @anky_91
      猜你喜欢
      • 1970-01-01
      • 2022-12-31
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2021-11-24
      • 2013-10-15
      相关资源
      最近更新 更多