在包含特定字符串的行中将 table 分成两部分

Separating a table into two at a row containing a particular string

我有一个 table 如下所示,我想将其分成两部分。问题是行数不同,我需要 table 在包含字符串 'CPT' 的第三行分隔。此行并不总是第 10 行。 table 由数据帧 dfm 表示。我希望能够创建两个新的数据框,一个包含第三行上方的行 'CPT' 和一个包含第三行下方的行 'CPT'

到目前为止,我有以下代码来识别所有行,特别是包含 'CPT' 的第三行,但我不确定我是否在正确的轨道上。

dfm.columns
i= dfm.index[dfm['LABEL(click to hide)'] == 'CPT'].tolist()
i
i[-1]
Filter_dfm  = dfm[dfm.index.isin(i)]
Filter_dfm

编辑: 我使用以下代码在包含 'CPT'

的行将数据帧 dfm 拆分为多个数据帧
dfm.rename(columns = {'LABEL(click to hide)' : 'ExSD', '(I)' : 'Risk'}, inplace = True)

m = dfm.ExSD.str.contains('CPT').cumsum()
d = {f'dfm{i}': g for i, g in dfm.groupby(m)}

for k, v in d.items():
    print(k)
    print(v, end='\n\n')

然后return我想要的数据框 输入:

d['dfm2']

输出:

ExSD    Risk
1   CPT     % Utilization Cumulative (With No New Charge) ...
2   05/1622:00  115.97 %
3   05/1700:45  37.3 %
4   05/1705:00  34.21 %
5   05/1712:00  22.27 %
6   05/1714:00  30.01 %
7   05/1716:00  33.93 %
8   05/1717:00  42.04 %
9   05/1718:00  46.48 %

输入:

d['dfm3']

输出:

    ExSD    Risk
10  CPT     % Utilization Cumulative (With No New Charge) ...
11  05/1622:00  8.24 %
12  05/1700:45  53.05 %
13  05/1705:00  36.04 %
14  05/1712:00  21.21 %
15  05/1714:00  20.65 %
16  05/1716:00  21.13 %
17  05/1717:00  23.09 %
18  05/1718:00  23.46 %

答案已修改,因为增加了不规则行数拆分的要求。修改是找到index,应该是data frame的header,用numpy的split函数拆分。然后使用该拆分信息在原始数据框中进行拆分,删​​除显示为 header 的行,并更新列名称。

mask = df[df['value1'] == 'CPT'].index.tolist()
mask
[0, 1, 10]
mask2 = np.array_split(df.index, np.array(mask))
mask2
[Int64Index([], dtype='int64'),
 Int64Index([0], dtype='int64'),
 Int64Index([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64'),
 Int64Index([10, 11, 12, 13, 14, 15, 16, 17, 18], dtype='int64')]

df1 = df[df.index.isin(mask2[2])]
df2 = df[df.index.isin(mask2[3])]

df1.drop(df.index[1], inplace=True)
df2.drop(df.index[10], inplace=True)

df1.columns = df.iloc[0]
df2.columns = df.iloc[0]

df1

CPT % Utilization Cumulative(With No New Change)
2 04/2905:00 173.31%
3 04/2912:00 29.19%
4 04/2914:00 32.62%
5 04/2916:00 35.4%
6 04/2917:00 45.3%
7 04/2918:00 50.12%
8 04/2922:00 44.16%
9 04/3000:00 41.58%