使用右侧第N个下划线作为分隔符将一列分成两列

问题描述 投票:0回答:1

假设我有一个数据框

df
如下:

    id          value_type_and_model_name
0    1                       actual_value
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

我想使用

右侧第二个下划线
作为分隔符将此列拆分为两列('actual_value'除外)。 预期结果如下:

    id             value_type   model_name
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        UT_ES
8    9     fitted_lower_value        UT_ES
9   10     fitted_upper_value        UT_ES
10  11        predicted_value        UT_ES
11  12  predicted_lower_value        UT_ES
12  13  predicted_upper_value        UT_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

如何实现这一目标?谢谢。

python-3.x pandas dataframe split
1个回答
1
投票

由于第二块中“仅”有一个下划线,最简单的方法是为该特定情况制作一个正则表达式:

out = (df['value_type_and_model_name']
       .str.extract(r'(?P<value_type>.*)_(?P<model_name>[^_]*_[^_]*)$')
      )

输出:

               value_type   model_name
0                     NaN          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

如果需要,您可以分配给原始数据框:

df[['value_type', 'model_name']] = df.pop('value_type_and_model_name').str.extract(r'(.*)_([^_]*_[^_]*)$')

输出:

    id             value_type        model
0    1                    NaN          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
© www.soinside.com 2019 - 2024. All rights reserved.