Серия срезов на основе значений в другой серии того же фрейма данных

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

У меня есть образец фрейма данных ниже, и я пытаюсь перейти к следующему выводу. Просмотрел множество примеров, но, похоже, ни один из них не подходит для этого конкретного сценария. См. Пример данных.

Не уверен, есть ли способ добиться этого с помощью apply or map , но я не привязан к нему.

 
df = pd.DataFrame({'collen': [5, 3, 2, None, 3], 'colstr': ['turquoise', 'white', 'blue', 'red',None]})

    collen  colstr
0   5.0     turquoise
1   3.0     white
2   2.0     blue
3   NaN     red
4   3.0     None

  

Ожидаемый результат:

     collen  colstr      new_col_str
0   5.0     turquoise   turqu
1   3.0     white       whi
2   2.0     blue        bl
3   NaN     red         red
4   3.0     None        None
  

Ответ №1:

если вы используете последнюю версию pandas, поддерживающую nullale integers ( Int64 ) , то сначала приведите collen к Int64 . Затем используйте это как для нарезки строк.

 df.collen = df.collen.astype('Int64')
  

затем используйте следующую лямбду для создания нового столбца

 df['new_col_str'] = df.apply(
    lambda x: x.colstr if pd.isnull(x.colstr) or pd.isnull(x.collen) else x.colstr[:x.collen], 
    axis=1
    )
  

Комментарии:

1. на той же ноте, есть ли способ выполнить поиск содержимого по ряду? т.е. Вывод является логическим флагом, если строка col1 в данной строке содержится в строке col2 той же строки.

2. @Drj, не уверен, что вы имеете в виду, пожалуйста, сделайте полный пост с примером ввода-вывода и попытайтесь помочь сообществу SO ответить на ваш вопрос

Ответ №2:

Попробуйте выполнить два условия здесь 🙂

 df['new'] = df.apply(lambda x : x['colstr'] if pd.isnull(x['collen']) or pd.isnull(x['colstr']) else x['colstr'][:int(x['collen'])],axis=1)
df
Out[98]: 
   collen     colstr    new
0     5.0  turquoise  turqu
1     3.0      white    whi
2     2.0       blue     bl
3     NaN        red    red
4     3.0       None   None
  

Ответ №3:

 def f(row):
    if row["colstr"] is None:
        return None
    elif pd.isna(row["collen"]):
        return row["colstr"]
    else:
        return row["colstr"][:int(row["collen"])]

df.apply(f, axis=1)
  

Результат

 0    turqu
1      whi
2       bl
3      red
4     None
dtype: object