代码之家  ›  专栏  ›  技术社区  ›  satoshi

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

  •  3
  • satoshi  · 技术社区  · 6 年前

    我有以下数据框

    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 STR 1.0 浮动 所以我可以:

    (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 回复  |  直到 6 年前
        1
  •  3
  •   jpp    6 年前

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

    loc+pd.to_数字

    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 . 如果您 期待 数值为数值,仅在边缘情况下寻找替代治疗。

        2
  •  2
  •   Jan    6 年前

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

    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
    
        3
  •  0
  •   harvpan    6 年前

    您需要满足条件的行的索引。您可以将序列转换为数字,从而将字符串转换为 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