Как заполнить значения NaN в соответствии с типом данных во фрейме данных pandas? - PullRequest
1 голос
/ 16 марта 2020

Приветствую всех. У меня есть файл Excel, который мне нужно очистить и заполнить значения NaN в соответствии с типами данных столбца, например, если тип данных столбца является объектом, мне нужно заполнить «NULL» в этом столбце, и если типы данных являются целыми числами или с плавающей запятой, 0 необходимо заполнить в этих столбцах.

До сих пор я пробовал 2 метода, чтобы выполнить работу, но не повезло, вот первый

df = pd.read_excel("myExcel_files.xlsx")

, использующий метод bulit для выбора столбцов по типам данных

df.select_dtypes(include='int64').fillna(0, inplace=True)

df.select_dtypes(include='float64').fillna(0.0, inplace=True)

df.select_dtypes(include='object').fillna("NULL", inplace=True)

и вывод, который я получаю, является не ошибкой, а предупреждением , и нет никаких изменений во фрейме данных

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py:4259: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  **kwargs

, поскольку первый был ошибкой среза, поэтому Я думал делать это по одному столбцу за раз, вот код

df = pd.read_excel("myExcel_files.xlsx")

#get the list of all integer columns
int_cols = list(df.select_dtypes('int64').columns)

#get the list of all float columns
float_cols = list(df.select_dtypes('float64').columns)

#get the list of all object columns
object_cols = list(df.select_dtypes('object').columns)

#looping through if each column to fillna
for i in int_cols:
    df[i].fillna(0,inplace=True)

for f in float_cols:
    df[f].fillna(0,inplace=True)

for o in object_cols:
    df[o].fillna("NULL",inplace=True)

Оба моих метода не работают. Большое спасибо за любую помощь или предложения. С уважением - Мани sh

1 Ответ

5 голосов
/ 16 марта 2020

Я думаю, что вместо использования select_dtypes и итерации по столбцам вы можете взять .dtypes вашего DF и заменить на float64 wth 0.0 и объекты на "NULL" ... вам не нужно беспокоиться о int64, так как обычно у них не будет пропущенных значений для заполнения (если вы не используете pd.NA или тип int с нулевым значением), поэтому вы можете выполнить одну операцию:

df.fillna(df.dtypes.replace({'float64': 0.0, 'O': 'NULL'}), inplace=True)

Вы также можете добавьте downcast='infer', чтобы, если у вас есть то, что может быть int64 с в столбце float64, вы получите int64 с, например, с учетом:

df = pd.DataFrame({
    'a': [1.0, 2, np.nan, 4],
    'b': [np.nan, 'hello', np.nan, 'blah'],
    'c': [1.1, 1.2, 1.3, np.nan]
})

Тогда:

df.fillna(df.dtypes.replace({'float64': 0.0, 'O': 'NULL'}), downcast='infer', inplace=True)

Даст вам (примечание, столбец a был понижен до int, но c остается плавающим):

   a      b    c
0  1   NULL  1.1
1  2  hello  1.2
2  0   NULL  1.3
3  4   blah  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...