В своем вопросе вы говорите
например. <1 становится 0,5, <0,5 становится 0,25, <5 становится 2,5 и т. Д. Обычные числа и <strong>текст должен быть неизменным .
Теперь в приведенном вами примере у вас есть только первые два типа данных: строки типа <1
и float
s, но вы, похоже, хотите иметь возможность сохранять любой другой тип текста. Однако я вижу , смешивающий разные dtypes в одном столбце как неправильный макет кадра данных , который в будущем вызовет проблемы.
Если, например, в вашем столбце есть текст hello
, простая операция, такая как:
df['Cu'] * 2
# [...]
# 6 13.6272
# 7 hellohello
# 8 0.05
# 9 1.88
# [...]
# Name: Cu, dtype: object
Скорее всего, это не то, что вы хотите.
Теперь я не знаю, какие у вас другие типы текста, но для приведенных примеров я бы рекомендовал сначала нормализовать dtypes: для этого мы создадим новый столбец df['less_than']
из «информации о неопределенности»:
import pandas as pd
df=pd.DataFrame()
df['Cu']=[3.7612,1.3693, 2.7502,1.407,4.2066,6.4409,6.8136,"<0.05","<0.05",0.94,0.07,1.82,2.63,1.36,0.78]
df['less_than'] = df['Cu'].str.startswith('<', False)
df.loc[df['less_than'], 'Cu'] = df.loc[df['less_than'], 'Cu'].str.slice(1)
df['Cu'] = df['Cu'].astype(float)
# Cu less_than
# 0 3.7612 False
# 1 1.3693 False
# 2 2.7502 False
# 3 1.4070 False
# 4 4.2066 False
# 5 6.4409 False
# 6 6.8136 False
# 7 0.0500 True
# 8 0.0500 True
# 9 0.9400 False
# 10 0.0700 False
# 11 1.8200 False
# 12 2.6300 False
# 13 1.3600 False
# 14 0.7800 False
Это позволяет нам обрабатывать весь столбец df['Cu']
одинаково, а ваши операции «<1 становится 0,5» простым однострочным: </p>
df.loc[df['less_than'], 'Cu'] /= 2