Получить список типов в столбцах фрейма данных, пропуская ячейки NaN

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Допустим, у меня есть этот фрейм данных:

 df

col1    col2        col3     col4
  1       apple     NaN      apple
  2       NaN       False    1.3
  NaN     orange    True     NaN

  

Я хотел бы получить список всех типов в каждом столбце, исключая ячейки NaN / null. Вывод может быть в виде словаря, подобного этому:

 {'col1': int, 'col2': str, 'col3':bool, 'col4': [str,float]}

  

Я дошел до создания словаря, который выводит все строки в каждом столбце, включая значения NaN. Я не уверен, как исключить NAN.

 output = {}
for col in df.columns.values.tolist():
    list_types = [x.__name__ for x in df[col].apply(type).unique()]
    output[col] = list_types
  

Приведенный выше код дал бы мне почти то, что я хочу, но с кучей дополнительных «плавающих» для NAN:

 {'col1': [int,float], 'col2': [str,float], 'col3':[bool,float], 'col4': [str,float]}

  

Ответ №1:

Для исключения nan выполните

 df = df.dropna()
  

Затем для получения типов данных:

 df.dtypes
  

Комментарии:

1. .dropna() в этом случае удалит все столбцы, сделав df пустым фреймом данных. кроме того, dtypes отличается от apply(типы)

Ответ №2:

В приведенном ниже подходе я извлек элементы, отличные от NAN, в список, а затем нашел dtype оставшегося списка:

 #initialize the empty column
output={}

#loop over the columns
for column in df:
  a=[x for x in df[column] if str(x)!= 'nan'] 
  output[column]=type(a[0])
  

Ответ №3:

Попробуйте stack , это приведет к удалению NaN , затем мы делаем groupby unqiue

 df.stack().apply(lambda x : type(x).__name__).groupby(level=1).unique().to_dict()
{'col1': array(['float'], dtype=object), 'col2': array(['str'], dtype=object), 'col3': array(['bool'], dtype=object), 'col4': array(['str'], dtype=object)}