Функция, чтобы проверить, является ли значение столбца object-dtype плавающим или строковым - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь написать функцию, которая равна функции isnumber [column] в Excel

набор данных:

feature1 feature2 feature3
  123       1.07     1
  231       2.08     3
  122        ab      4
  111       3.04     6
  555        cde     8

feature1: integer dtype
feature2: object dtype
feature3: integer dtype

Я попробовал этот кусок кода

for item in df.feature2.iteritems():
    if isinstance(item, float):
       print('yes')
    else:
       print('no')

Я получил результат как

 no
 no
 no
 no
 no

Но я хочу получить результат как

yes
yes
no
yes
no

Когда я попытался проверить тип отдельных значений feature2, это то, что отображается

type(df.feature2[0]) = str
type(df.feature2[1]) = str
type(df.feature2[2]) = str
type(df.feature2[3]) = str
type(df.feature2[4]) = str

But clearly 0,1,3 should be shown as float, but they show up as str

Что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Вы можете сделать что-то вроде этого:

from pandas import DataFrame as df

columns = ['feature1', 'feature2', 'feature3']
data = [[123, 1.07, 1],
 [231, 2.08, 3],
 [122, 'ab', 4],
 [111, 3.04, 6],
 [555, 'cde', 8]]

df_ = df(data, columns=columns)
types = []
for k in df_:
    a = set(type(m) for m in df_[k])
    if len(a) > 1:
        types.append({k: 'object'})
    else:
        types.append({k: str(list(a)[0].__name__)})

print(types)

Вывод:

[{'feature1': 'int'}, {'feature2': 'object'}, {'feature3': 'int'}]
0 голосов
/ 21 ноября 2018

Это потому, что iteritems() возвращает кортеж, который является (index, value).Таким образом, вы пытаетесь проверить, например, (0, 1.07) или (1, 2.08) типа float, что, конечно же, не относится к типу.

Должно работать, если вы измените df.feature2.iteritems() на df.feature2.values:)

0 голосов
/ 21 ноября 2018

Iteritems возвращает кортеж, ((123, '1.07'), 1.07), и, поскольку вы хотите перебрать каждое значение, попробуйте приведенный ниже код.Вам просто нужно удалить .iteritems(), и он будет работать как шарм.

df['feature2']=[1.07,2.08,'ab',3.04,'cde']
for item in df.feature2:
    if isinstance(item,float):
       print('yes')
    else:
       print('no')

Вот ваш вывод:

yes
yes
no
yes
no
0 голосов
/ 21 ноября 2018

Попробуйте это:

for i in range(len(df["feature2"])):
    test = df.loc[i,"feature2"]
    if isinstance(test, float):
        print('yes')
    else:
        print('no')
...