在包含特定字符串的行中将 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%
我有一个 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% |