Удаление значений со смешанными типами данных - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующий DataFrame

A       B       C
1.0     abc     1.0
abc     1.0     abc
-1.11   abc     abc

У меня смешанные типы данных (float и str).Как я могу сбросить значения <= -1 в column A.

Я получаю сообщение об ошибке, если я делаю следующее из-за смешанных типов данных

df['A'] = (df['A'] != "abc") & (df['A'] > -1)
TypeError: '>' not supported between instances of 'str' and 'int'

Как я могу изменить свой объект, чтобы сделать abc a str и 1.0 a float чтобы я мог:

(df['A'] != "abc") & (df['A'] > -1)

print(df['A'].dtype)
    -> object

Я хотел бы получить ожидаемый результат

df = 

A       B       C
1.0     abc     1.0
abc     1.0     abc
NaN     abc     abc

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

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

ser = pd.to_numeric(df['A'], errors='coerce')
df.loc[df['A']!='abc'].drop(list(ser[ser<=-1].index))

Выход:

    A   B   C
0  1.0  abc 1.0
0 голосов
/ 04 июня 2018

Существует как минимум пара различных подходов к этой проблеме.

loc + pd.to_numeric

pd.DataFrame.loc принимает логические ряды, поэтому вы можете вычислитьмаска через pd.to_numeric и подача в установщик loc.

Обратите внимание, что указывать df['A'] != 'abc' не нужно, потому что серия mask преобразует эти значения в NaN.

mask = pd.to_numeric(df['A'], errors='coerce') < -1
df.loc[mask, 'A'] = np.nan

print(df)

     A    B    C
0    1  abc    1
1  abc    1  abc
2  NaN  abc  abc

пробовать / исключать

См. @ решение Яна .Это решение предпочтительнее, если вы ожидаете, что значения будут числовыми, и ищете альтернативный вариант только в крайних случаях.

0 голосов
/ 04 июня 2018

Вы можете использовать небольшую функцию для преобразования значений в числа:

import pandas as pd, numpy as np

df = pd.DataFrame({
    'A': [1.0, 'abc', -1.11], 
    'B': ['abc', 1.0, 'abc'], 
    'C': [1.0, 'abc', 'abc']})

def change(value):
    try:
        v = float(value)
        if v < -1:
            value = np.nan
    except ValueError:
        pass
    return value

df['A'] = df['A'].apply(change)
print(df)

Это дает

     A    B    C
0    1  abc    1
1  abc    1  abc
2  NaN  abc  abc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...