#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)}