如果列值以' Table',Python 3.6开头,则将数据帧拆分为多个数据帧

时间:2017-09-18 11:05:09

标签: python python-3.x pandas dataframe

我已将excel文件导入到dataframe&它包含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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您可以使用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

答案 2 :(得分:2)

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