删除具有混合数据类型的值

时间:2018-06-04 19:53:26

标签: python python-3.x pandas numpy

我有以下DataFrame

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

我有混合数据类型(floatstr)。如何在<= -1中删除值column A

如果由于混合数据类型

而执行以下操作,则会出现错误
df['A'] = (df['A'] != "abc") & (df['A'] > -1)
TypeError: '>' not supported between instances of 'str' and 'int'

如何更改我的对象以使abc成为str1.0成为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 :(得分:3)

这个问题至少有几种不同的方法。

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

尝试/除

@Jan's solution。如果期望值为数字且仅在边缘情况下寻找替代处理,则此解决方案更可取。

答案 1 :(得分:2)

您可以使用一个小函数将值转换为数字:

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

答案 2 :(得分:0)

您需要符合条件的行的索引。您可以将系列转换为数字,这会将字符串转换为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