Основываясь на моей конкретной проблеме c, я попытался создать небольшой воспроизводимый пример, не доходя до точки. Он прикреплен в конце вопроса.
В настоящее время я читаю 27 файлов Excel.
Все они отформатированы одинаково (очевидно, что все столбцы соответствуют друг другу).
Я добавляю эти данные в один DataFrame, состоящий из 9828 строк и трех столбцов.
Один столбец с именем "Target" должен состоять только из числа с плавающей запятой или целого числа.
Фактически ячейки, составляющие столбец Target, читаются как:
- Float
- Только в одном случае пустая ячейка читается как строка
- In в других случаях рассматриваются пустые ячейки
None
Чтобы понять, какие именно строки столбца DataFrame c содержат float / none / string, я создал очень неэффективный способ проверки и разделения кадра данных на основе тип данных
dt_t is a dataframe with 3 columns one of this is called Target
This column is composed by 9398 non-null object.
The other two by 9828 non-null object.
df_string=pd.DataFrame()
df_float=pd.DataFrame()
df_null=pd.DataFrame()
for i in range(len(df_t.Target)):
if type(df_t.Target.loc[i])==str:
df_string=df_string.append(df_t.loc[i])
if type(df_t.Target.loc[i])==int or type(df_t.Target.loc[i])==float:
df_float=df_float.append(df_t.loc[i])
else:
df_null=df_null.append(df_t.loc[i])
Я не могу понять, почему:
Есть дубликат. df_string
и df_null
содержат одинаковое значение
В кадре данных с плавающей запятой у меня все еще есть nan
значения
My ожидаемый результат должен был видеть
- Только float и int в одном кадре данных
- Только nan в df_null
- Только строка в df_string dataframe
Самый элегантный способ извлечь значения nan был в этом ответе , но я думаю, что моя проблема немного отличается
df.loc[~df.index.isin(df.dropna().index)]
Я также попытался найти некоторые ресурсы и прочитать документацию чтобы понять, почему pd.read_excel()
имеет такое поведение, но я не нашел ничего полезного.
Вот код, который я пытался создать для воспроизводимого вопроса (но не работает):
a=pd.Series(np.random.uniform(1.00,100.00,9000))
b=np.empty(400)
b=pd.Series(np.full_like(b,np.nan))
c=pd.Series('None')
start_dict={"Target":[0,2,3.5] }
df_t=pd.DataFrame(start_dict)
df_t=pd.concat([df_t,a],axis=0,ignore_index=True)
df_t=pd.concat([df_t,b],axis=0,ignore_index=True)
df_t=pd.concat([df_t,c],axis=0,ignore_index=True)
Здесь мой фактический вывод при печати df_string
и df_null
:
Здесь в желтой ячейке ссылки в файле xlsx
: