#python #pandas
Вопрос:
У меня есть фрейм данных:
df = pd.DataFrame({"ID": [1,2,3,4,5,6,7], "value": [10,10.00,"123JK",20,10-11,11.00,12.00]})
ID value
1 10
2 10.00
3 123JK
4 20
5 10-11
6 11.00
7 12.00
Я хочу преобразовать только плавающее значение в целое, чтобы:
ID value
1 10
2 10
3 123JK
4 20
5 10-11
6 11
7 12
Я попытался выполнить следующий код:
df['ID'] = df['ID'].apply(pd.to_numeric, errors='ignore')
df['ID'].astype(np.int64,errors='ignore')
Но он не преобразует все плавающее значение в целое число.
Комментарии:
1. Ваш столбец представляет собой строку, поэтому вместо этого выполните итерацию через coumn.
2. Сценарий кажется неправильным… разве вас не интересует столбец «значение», а не «идентификатор»? Идентификатор уже имеет тип int64. «значение» — это сочетание типов объектов.
Ответ №1:
Если нужны целые числа только для целых чисел с плавающей точкой, например 10.0
, используйте пользовательскую функцию:
def f(x):
try:
x = pd.to_numeric(x, errors='ignore')
if int(x) == x:
return int(x)
else:
return x
except:
return x
df['value'] = df['value'].apply(f)
print (df)
ID value
0 1 10
1 2 10
2 3 123JK
3 4 20
4 5 10-11
5 6 11
6 7 12
Ответ №2:
Ну, если предположить, что value
столбец будет текстовым, вы могли бы просто заменить регулярное выражение здесь:
df["value"] = df["value"].str.replace(r'^(d ).d
Ответ №3:
Я предпочитаю pd.to_numeric
с fillna
:
df['value'] = pd.to_numeric(df['value'], errors='coerce').fillna(df['value'])
Это приведет к преобразованию в числовые dtype
значения s и замене нечисловых данных на NaN
. Затем я заполняю NaN
s исходным столбцом со строками, это сохранит числовые данные числовыми.
Комментарии:
1. @jezrael Не воспроизводится для меня, я протестировал и не плавает.
2. может быть, моя версия панды. ОК.
3. @jezrael я использую
pandas 1.1.3
4. Немного староват, хммм
5. @jezrael Или вы можете попробовать:
pd.to_numeric(df['value'], errors='coerce').fillna(df['value']).astype('Int8')
.
, r'1')
Ответ №3:
Я предпочитаю pd.to_numeric
с fillna
:
Это приведет к преобразованию в числовые dtype
значения s и замене нечисловых данных на NaN
. Затем я заполняю NaN
s исходным столбцом со строками, это сохранит числовые данные числовыми.
Комментарии:
1. @jezrael Не воспроизводится для меня, я протестировал и не плавает.
2. может быть, моя версия панды. ОК.
3. @jezrael я использую
pandas 1.1.3
4. Немного староват, хммм
5. @jezrael Или вы можете попробовать:
pd.to_numeric(df['value'], errors='coerce').fillna(df['value']).astype('Int8')
.