我已将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
答案 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
检查每行至少有一个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