Возврат нечисловых элементов только из кадра данных Pandas - PullRequest
0 голосов
/ 30 мая 2018

У меня есть датафрейм, созданный из файла .CSV.Каждый столбец должен состоять только из числовых значений, однако иногда он может быть строкой ('> 18', '<5', 'CANCELED' и т. Д.) </p>

Перед использованием pd.to_numeric для преобразования столбцов вчисловые и приведение нечисловых значений, я хотел бы создать новый фрейм данных или словарь, который содержит уникальные нечисловые значения, найденные в каждом столбце.Это поможет понять, какие нечисловые входные данные мы получаем для использования наших функций в одной или нескольких прогнозирующих моделях.

Это кажется довольно простой задачей, но я довольно плохо знаком с Python и имеютрудно разобраться.

Пока что я сократил кадр данных только до столбцов объекта dtype, что кажется хорошим первым шагом, и удалил большинство столбцов, которые имеют все числовые значения:

df = df.select_dtypes(include='object')

Я думаю, что мне нужно перебрать каждый элемент и применить некоторую функцию, используя isnumeric (), чтобы создать новый фрейм данных?Или словарь, в котором каждое имя столбца содержит строковые значения в качестве имени ключа, а словарное значение представляет собой список уникальных строковых значений, найденных в этом столбце?

Любая помощь по наиболее эффективному способу решения этой проблемы очень ценится.

Пример кадра данных:

FEATURE_1   FEATURE_2   FEATURE_3   FEATURE_4
1               1         <1.5        >3.4
Nan             2           2           4
4            CANCELED       3          4.5
1.34            2         <1.5         <2

Желаемый вывод:

{'FEATURE_2':['CANCELED'],'FEATURE_3':['<1.5'],'FEATURE_4':['>3.5','<2']}

Спасибо!

1 Ответ

0 голосов
/ 31 мая 2018

Одна идея состоит в том, чтобы попытаться преобразовать каждый элемент в каждой серии в float.В случае успеха верните NaN;в противном случае верните элемент.

Используйте dropna и drop_duplicates для удаления конвертируемых строк и дубликатов.

import pandas as pd
import numpy as np
from io import StringIO

mystr = StringIO("""FEATURE_1   FEATURE_2   FEATURE_3   FEATURE_4
1               1         <1.5        >3.4
NaN             2           2           4
4            CANCELED       3          4.5
1.34            2         <1.5         <2""")

# replace mystr with 'file.csv'
df = pd.read_csv(mystr, delim_whitespace=True)

# define float converter check
def converter(x):
    try:
        x = float(x)
        return np.nan
    except ValueError:
        return x

# use list comprehension to apply function and clean up
res = {col: df[col].apply(converter).dropna()\
                   .drop_duplicates().tolist() for col in df}

{'FEATURE_1': [],
 'FEATURE_2': ['CANCELED'],
 'FEATURE_3': ['<1.5'],
 'FEATURE_4': ['>3.4', '<2']}
...