由于第二个区块中“只有”一个下划线,因此最简单的方法是为特定情况编写正则表达式:
out = (df['value_type_and_model_name']
.str.extract(r'(?P<value_type>.*)_(?P<model_name>[^_]*_[^_]*)$')
.fillna({'value_type': df['value_type_and_model_name']})
)
regex demo (extract)
输出:
value_type model_name
0 actual_value NaN
1 fitted_value RUT_ARIMA
2 fitted_lower_value RUT_ARIMA
3 fitted_upper_value RUT_ARIMA
4 predicted_value RUT_ARIMA
5 predicted_lower_value RUT_ARIMA
6 predicted_upper_value RUT_ARIMA
7 fitted_value RUT_ES
8 fitted_lower_value RUT_ES
9 fitted_upper_value RUT_ES
10 predicted_value RUT_ES
11 predicted_lower_value RUT_ES
12 predicted_upper_value RUT_ES
13 fitted_value RUT_SARIMAX
14 fitted_lower_value RUT_SARIMAX
15 fitted_upper_value RUT_SARIMAX
16 predicted_value RUT_SARIMAX
17 predicted_lower_value RUT_SARIMAX
18 predicted_upper_value RUT_SARIMAX
如果你真的想
split
:
df['value_type_and_model_name'].str.split('_(?=[^_]*_[^_]*$)', expand=True)
regex demo (split)
如果需要,可以为原始数据帧指定:
s = df.pop('value_type_and_model_name')
df[['value_type', 'model_name']] = (s.str.extract(r'(.*)_([^_]*_[^_]*)$')
.fillna({0: s})
)
输出:
id value_type model
0 1 actual_value NaN
1 2 fitted_value RUT_ARIMA
2 3 fitted_lower_value RUT_ARIMA
3 4 fitted_upper_value RUT_ARIMA
4 5 predicted_value RUT_ARIMA
5 6 predicted_lower_value RUT_ARIMA
6 7 predicted_upper_value RUT_ARIMA
7 8 fitted_value RUT_ES
8 9 fitted_lower_value RUT_ES
9 10 fitted_upper_value RUT_ES
10 11 predicted_value RUT_ES
11 12 predicted_lower_value RUT_ES
12 13 predicted_upper_value RUT_ES
13 14 fitted_value RUT_SARIMAX
14 15 fitted_lower_value RUT_SARIMAX
15 16 fitted_upper_value RUT_SARIMAX
16 17 predicted_value RUT_SARIMAX
17 18 predicted_lower_value RUT_SARIMAX
18 19 predicted_upper_value RUT_SARIMAX