#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