#python #pandas #replace
#python #pandas #заменить
Вопрос:
У меня есть фрейм данных с именем столбца, как показано ниже:
Column (Name) Column Name 2 Column3 Column (4)
NULL NULL C3 100
22 C44 C55 NULL
2 C5 C11 13
Я хочу заменить нулевые значения из подмножества, скажем Column (Name)
, и Column (4)
на средние и минимальные значения. Как это сделать? Значения в Column (Name)
и Column (4)
являются числовыми
df['Column (Name)']=df['Column (Name)'].fillna(df['Column (Name)'].mean())
df['Column (4)']=df['Column (4)'].fillna(df['Column (4)'].min())
Я получаю сообщение об ошибке ниже:
TypeError: can only concatenate str (not "int") to str
Ожидаемый результат:
Column (Name) Column Name 2 Column3 Column (4)
12 NULL C3 100
22 C44 C55 13
2 C5 C11 13
Ответ №1:
Ваша ошибка означает, что в столбце есть некоторые нечисловые значения.
Проверьте, являются ли столбцы числовыми, если нет, преобразуйте их в df.dtypes:
print(df.dtypes)
Затем вы можете проверить, какие значения неверны:
print (df.loc[pd.to_numeric(df['Column (Name)'], errors='coerce').isna(), 'Column (Name)'])
И последнее преобразование в числовое:
df['Column (Name)'] = pd.to_numeric(df['Column (Name)'], errors='coerce')
df['Column (4)'] = pd.to_numeric(df['Column (4)'], errors='coerce')
Или, если хотите преобразовать несколько столбцов:
cols = ['Column (Name)','Column (4)']
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce')
А затем используйте ваше решение:
df['Column (Name)']=df['Column (Name)'].fillna(df['Column (Name)'].mean())
df['Column (4)']=df['Column (4)'].fillna(df['Column (4)'].min())
Или вы можете использовать DataFrame.agg
:
df = df.fillna(df.agg({'Column (Name)':'mean', 'Column (4)':'min'}))
print (df)
Column (Name) Column Name 2 Column3 Column (4)
0 12.0 NaN C3 100.0
1 22.0 C44 C55 13.0
2 2.0 C5 C11 13.0
Ответ №2:
На самом деле, используя ваш код, у меня нет ошибки. Пожалуйста, сравните с моим кодом dtypes
.
import io
import pandas as pd
Чтение ваших данных.
df = pd.read_csv(io.StringIO("""
Column (Name) Column Name 2 Column3 Column (4)
NULL NULL C3 100
22 C44 C55 NULL
2 C5 C11 13
"""), sep="ss ", engine="python")
Проверьте типы данных.
df.dtypes
Column (Name) float64
Column Name 2 object
Column3 object
Column (4) float64
dtype: object
Код для заполнения означает и мин.
df['Column (Name)']=df['Column (Name)'].fillna(df['Column (Name)'].mean())
df['Column (4)']=df['Column (4)'].fillna(df['Column (4)'].min())
Заполненные значения равны 12.0 и 13.0.
Комментарии:
1. Типы данных являются объектами
Ответ №3:
Эта ошибка возникает при попытке объединить строку и целое число. Вы можете объединить только в том случае, если существует тот же тип. Попробуйте преобразовать целые числа в строку с помощью метода str().