代码之家  ›  专栏  ›  技术社区  ›  ah bon

使用右起第N个下划线作为分隔符,将列拆分为两列

  •  0
  • ah bon  · 技术社区  · 2 年前

    假设我有一个数据帧 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
    

    如何做到这一点?谢谢我尝试使用代码: df['value_type_and_model_name'].str.rsplit('_', n=2, expand=True) ,但它不起作用。

    1 回复  |  直到 2 年前
        1
  •  2
  •   mozway    2 年前

    由于第二个区块中“只有”一个下划线,因此最简单的方法是为特定情况编写正则表达式:

    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
    
    推荐文章