我不确定这个问题有多具有挑战性,但这是我的问题:
我有一个数据框如下:
df-in
ColA ColB ColC ColD
PA 1 2 c
PB 3 3 d
PA 5 11 x
Ind1 Suma 20 14 z
QA 3 7 a
QB 3 7 b
QC 5 8 c
QD 5 12 c
Ind2 Dat 202 3 y
RA 12 1 a
RB 13 1 v
RC 14 1 q
Ind3 CapT 120 3 t
Other 10 4 x
所以现在的问题是,我要做的是创建一个列(例如 ColN),该列仅包含指标值(ColA 中的 Ind1 或 Ind2 或 Ind3),但遵循以下规则:ColN 将包含所有 Ind1直到 ColA 具有 Ind1 值、Ind2、Ind1 和 Ind2 之间以及 Ind3 位于 Ind3 和 Ind2 之间。
(这里只是强调一下,Ind1,Ind2,Ind3可以是不同的字符串,如'star','planet','moon',但它们将永远保持不变。它们不会改变)
所以我的输出 df 将如下所示:
df-out
ColA ColB ColC ColD ColN
PA 1 2 c Ind1
PB 3 3 d Ind1
PA 5 11 x Ind1
Ind1 Suma 20 14 z Ind1
QA 3 7 a Ind2
QB 3 7 b Ind2
QC 5 8 c Ind2
QD 5 12 c Ind2
Ind2 Dat 202 3 y Ind2
RA 12 1 a Ind3
RB 13 1 v Ind3
RC 14 1 q Ind3
Ind3 CapT 120 3 t Ind3
Other 10 4 x Ind3
那么我怎样才能实现这一目标呢?我正在尝试迭代 ColA 或尝试将其放入列表中并尝试,但似乎没有任何效果。任何帮助将不胜感激。
pd.Series.where
(替换非指标值)和 pd.Series.bfill
用于向后填充:
df['ColN'] = df['ColA'].where(df['ColA'].str.startswith('Ind')).bfill()
ColA ColB ColC ColD ColN
0 PA 1 2 c Ind1 Suma
1 PB 3 3 d Ind1 Suma
2 PA 5 11 x Ind1 Suma
3 Ind1 Suma 20 14 z Ind1 Suma
4 QA 3 7 a Ind2 Dat
5 QB 3 7 b Ind2 Dat
6 QC 5 8 c Ind2 Dat
7 QD 5 12 c Ind2 Dat
8 Ind2 Dat 202 3 y Ind2 Dat
9 RA 12 1 a Ind3 CapT
10 RB 13 1 v Ind3 CapT
11 RC 14 1 q Ind3 CapT
12 Ind3 CapT 120 3 t Ind3 CapT
13 Other 10 4 x NaN
您可以为
where
设置另一个条件,具体取决于您的实际指标值模式。
str.extract
和 bfill
,也可以选择使用 ffill
:
df['ColN'] = df['ColA'].str.extract('(Ind\S+)', expand=False).bfill().ffill()
输出:
ColA ColB ColC ColD ColN
0 PA 1 2 c Ind1
1 PB 3 3 d Ind1
2 PA 5 11 x Ind1
3 Ind1 Suma 20 14 z Ind1
4 QA 3 7 a Ind2
5 QB 3 7 b Ind2
6 QC 5 8 c Ind2
7 QD 5 12 c Ind2
8 Ind2 Dat 202 3 y Ind2
9 RA 12 1 a Ind3
10 RB 13 1 v Ind3
11 RC 14 1 q Ind3
12 Ind3 CapT 120 3 t Ind3
13 Other 10 4 x Ind3