【问题标题】:Split data frame to multiple data frame if column value starts with 'Table', Python 3.6如果列值以“表”开头,则将数据框拆分为多个数据框,Python 3.6
【发布时间】:2017-09-18 11:05:08
【问题描述】:

我已将 excel 文件导入数据框,它包含 4 列,一些列值以“表格”开头。

我想拆分列值以“表”开头的数据框

数据框有以下数据

Col1    Col2    Col3    Col4
Table   1   2   3
fdg 4   gfh 5
6   7   8   9
10  11  12  13
rewer   Table   14  15
16  17  18  19
20  21  22  23
24  25  Table   gfdgfd
26  27  28

预期结果:

df1:

Col1    Col2    Col3    Col4
Table   1   2   3
fdg 4   gfh 5
6   7   8   9
10  11  12  13

df2:

Col1    Col2    Col3    Col4
rewer   Table   14  15
16  17  18  19
20  21  22  23

df3:

Col1    Col2    Col3    Col4
24  25  Table   gfdgfd
26  27  28

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    使用groupby

    In [113]: df1, df2, df3 = [x for _, x in df.groupby(df.eq('Table').any(1).cumsum())]
    
    In [114]: df1
    Out[114]:
        Col1 Col2 Col3 Col4
    0  Table    1    2    3
    1    fdg    4  gfh    5
    2      6    7    8    9
    3     10   11   12   13
    
    In [115]: df2
    Out[115]:
        Col1   Col2 Col3 Col4
    4  rewer  Table   14   15
    5     16     17   18   19
    6     20     21   22   23
    
    In [116]: df3
    Out[116]:
      Col1 Col2   Col3    Col4
    7   24   25  Table  gfdgfd
    8   26   27     28     NaN
    

    或者

    In [117]: dfs = [x for _, x in df.groupby(df.eq('Table').any(1).cumsum())]
    
    In [118]: dfs[0]
    Out[118]:
        Col1 Col2 Col3 Col4
    0  Table    1    2    3
    1    fdg    4  gfh    5
    2      6    7    8    9
    3     10   11   12   13
    
    In [120]: len(dfs)
    Out[120]: 3
    

    或者,使用dict,正如另一个答案中所指出的那样。

    【讨论】:

    • 我们能不能以“Table”或任何字符串开头?
    • df.apply(lambda x: x.str.startswith('Table')) 而不是 df.eq('Table')
    • @faithon.gvr.py 更准确:x.str.startswith('Table')
    • @Zero,我们可以全部导出到excel文件吗? bcz 我原来的数据框里面有很多表?
    • 是的,之前有人问过这个问题,在 SO/Goog 上搜索一下。
    【解决方案2】:

    您可以使用np.split 来拆分DataFrame。 np.split 的第二个参数可以是指示要拆分的位置的索引列表。这些索引可以通过以下方式找到:

    In [19]: np.flatnonzero((df == 'Table').any(axis=1))[1:]
    Out[19]: array([4, 7])
    

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({
        'Col1': ['Table', 'fdg', '6', '10', 'rewer', '16', '20', '24', '26'],
        'Col2': ['1', '4', '7', '11', 'Table', '17', '21', '25', '27'],
        'Col3': ['2', 'gfh', '8', '12', '14', '18', '22', 'Table', '28'],
        'Col4': ['3', '5', '9', '13', '15', '19', '23', 'gfdgfd', np.nan]})
    
    idx = np.flatnonzero((df == 'Table').any(axis=1))[1:]
    result = np.split(df, idx)
    
    for dfi in result:
        print(dfi)
    

    打印

        Col1 Col2 Col3 Col4
    0  Table    1    2    3
    1    fdg    4  gfh    5
    2      6    7    8    9
    3     10   11   12   13
        Col1   Col2 Col3 Col4
    4  rewer  Table   14   15
    5     16     17   18   19
    6     20     21   22   23
      Col1 Col2   Col3    Col4
    7   24   25  Table  gfdgfd
    8   26   27     28     NaN
    

    【讨论】:

      【解决方案3】:

      使用dict理解,输出为DataFrames的字典:

      dfs = {k:v for k, v in df.groupby((df == 'Table').any(1).cumsum())}
      print (dfs)
      
      {1:     Col1 Col2 Col3 Col4
      0  Table    1    2    3
      1    fdg    4  gfh    5
      2      6    7    8    9
      3     10   11   12   13, 2:     Col1   Col2 Col3 Col4
      4  rewer  Table   14   15
      5     16     17   18   19
      6     20     21   22   23, 3:   Col1 Col2   Col3    Col4
      7   24   25  Table  gfdgfd
      8   26   27     28     NaN}
      
      print (dfs[1])
      
          Col1 Col2 Col3 Col4
      0  Table    1    2    3
      1    fdg    4  gfh    5
      2      6    7    8    9
      3     10   11   12   13
      
      print (dfs[2])
          Col1   Col2 Col3 Col4
      4  rewer  Table   14   15
      5     16     17   18   19
      6     20     21   22   23
      

      如果需要默认索引添加reset_index:

      dfs = {k:v.reset_index(drop=True) for k, v in df.groupby((df == 'Table').any(1).cumsum())}
      print (dfs[2])
      
      
          Col1   Col2 Col3 Col4
      0  rewer  Table   14   15
      1     16     17   18   19
      2     20     21   22   23
      

      解释:

      检查Table - 输出是布尔数据帧

      print ((df == 'Table'))
          Col1   Col2   Col3   Col4
      0   True  False  False  False
      1  False  False  False  False
      2  False  False  False  False
      3  False  False  False  False
      4  False   True  False  False
      5  False  False  False  False
      6  False  False  False  False
      7  False  False   True  False
      8  False  False  False  False
      

      通过DataFrame.any检查每行是否至少有一个True

      print ((df == 'Table').any(1))
      0     True
      1    False
      2    False
      3    False
      4     True
      5    False
      6    False
      7     True
      8    False
      dtype: bool
      

      最后由cumsum创建群组:

      print ((df == 'Table').any(1).cumsum())
      0    1
      1    1
      2    1
      3    1
      4    2
      5    2
      6    2
      7    3
      8    3
      dtype: int32
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-12
        • 2020-01-08
        相关资源
        最近更新 更多