Группировка и разделение данных из одного столбца Pandas кадра данных на основе типа данных (float, Nan, string) - PullRequest
0 голосов
/ 07 февраля 2020

Основываясь на моей конкретной проблеме c, я попытался создать небольшой воспроизводимый пример, не доходя до точки. Он прикреплен в конце вопроса.

В настоящее время я читаю 27 файлов Excel.

Все они отформатированы одинаково (очевидно, что все столбцы соответствуют друг другу).

Я добавляю эти данные в один DataFrame, состоящий из 9828 строк и трех столбцов.

Один столбец с именем "Target" должен состоять только из числа с плавающей запятой или целого числа.

Фактически ячейки, составляющие столбец Target, читаются как:

  1. Float
  2. Только в одном случае пустая ячейка читается как строка
  3. 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])

Я не могу понять, почему:

  1. Есть дубликат. df_string и df_null содержат одинаковое значение

  2. В кадре данных с плавающей запятой у меня все еще есть nan значения

My ожидаемый результат должен был видеть

  1. Только float и int в одном кадре данных
  2. Только nan в df_null
  3. Только строка в 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:

enter image description here

Здесь в желтой ячейке ссылки в файле xlsx:

enter image description here

1 Ответ

1 голос
/ 07 февраля 2020

Тип небезопасен в использовании. Поскольку столбцы имеют смешанные типы, pandas будет использовать тип object для всех строк. Однако вы можете сделать это по-другому.

Сначала создайте пустые фреймы данных:

df_string = pd.DataFrame()
df_float = pd.DataFrame()
df_null = pd.DataFrame()

Теперь вам нужно создать функцию, которая классифицирует ваш оригинальный фрейм данных. Слегка измененная версия этого вопроса должен сделать:

def categorize(x):
    if x.isna():
        df_null = df_null.append([x]) # append does not change the original df
        return
    try:
        float(x)
    except ValueError:
        df_string = df_string.append([x])
    else:
        df_float = df_float.append([x])

Теперь все, что вам нужно сделать, это apply функция для столбца Target.

df['Target'].apply(lambda x: categorize(x), axis=1)
...