#python #pandas #numpy #dataframe #eval
#python #pandas #numpy #фрейм данных #оценка
Вопрос:
df = pd.DataFrame({'num':['9','','3','7','11']})
col_nm = 'num'
print(df)
num
0 9
1
2 3
3 7
4 11
Если число больше 5, я преобразую его в 5.
Но после числа 10 преобразование не выполняется.
string ="np.where(num == '',num,np.where(num >= '5', '5', num))"
string = string.replace(col_nm,"df['" col_nm "']")
df[col_nm] = eval(string)
print(df)
num
0 5
1
2 3
3 5
4 11
Есть ли какой-либо способ решить логику, используя данные и строку, сохраняя их нетронутыми?
Комментарии:
1. Я не верю, что ваш вопрос ясен. Каков ваш ожидаемый результат, строки или числа? Кроме того, не очень понятно, чего вы на самом деле пытаетесь достичь.
Ответ №1:
Нам нужно сначала преобразовать to_numeric
, а затем использовать назначение условия
df['num'] = pd.to_numeric(df['num'],errors='coerce')
df.loc[df['num'].between(5,10),'num'] = 5
df
Out[97]:
num
0 5.0
1 NaN
2 3.0
3 5.0
4 11.0
Комментарии:
1. @ BEN_YO OP также может использовать clip.
df=df.replace(regex=r'', value=np.nan).astype(float) m=df.num.between(5,10) df.clip(m,5,axis=0)