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

更改熊猫数据帧中的特定值(在混合类型中)

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

    我有一个pandas数据框,我希望通过一些增量(例如,.001)来增加大于零的任何值,但只增加列的一个子集。

    df=pd.DataFrame({'a': ['abc', 'abc', 'abc', 'abc'], 'b': [2,np.nan, 0, 6], 'c': [1, 0, 2, 0]})
    
         a    b  c
    0  abc  2.0  1
    1  abc  NaN  0
    2  abc  0.0  2
    3  abc  6.0  0
    

    所以我试了一下:

    df[df.loc[:,['b', 'c']]>0]+=1
    
    TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value
    

    但是,由于第一列具有对象数据类型,因此我无法执行此操作,正如您在错误中看到的那样。预期输出为:

         a    b      c
    0  abc  2.001  1.001
    1  abc  NaN    0
    2  abc  0.0    2.001
    3  abc  6.001  0
    

    有没有什么方法可以在不显式地循环遍历每一列的情况下完成这类工作?

    我相信我只是缺少一个简单的方法,但似乎找不到一个例子。

    3 回复  |  直到 6 年前
        1
  •  4
  •   Anton vBR    6 年前

    你可以试试这个:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'a': ['abc', 'abc', 'abc', 'abc'], 
                       'b': [2,np.nan, 0, 6], 
                       'c': [1, 0, 2, 0]})
    
    inc = 0.01
    df.loc[:, df.dtypes.ne('object')] += inc
    df.replace({inc:0}, inplace=True)        
    
    print(df)
    

    或者按照TAI和NP的建议,其中(这应该更快):

    cols = df.columns[df.dtypes.ne('object')]
    df[cols] += np.where(df[cols] >0, 0.01, 0)
    

    返回:

         a     b     c
    0  abc  2.01  1.01
    1  abc   NaN  0.00
    2  abc  0.00  2.01
    3  abc  6.01  0.00
    
        2
  •  3
  •   BENY    6 年前

    您可以使用 add 具有 select_dtypes

    df.add((df.select_dtypes(exclude=object)>0).astype(int)*0.0001).combine_first(df)
    Out[18]: 
         a       b       c
    0  abc  2.0001  1.0001
    1  abc     NaN  0.0000
    2  abc  0.0000  2.0001
    3  abc  6.0001  0.0000
    
        3
  •  2
  •   Tai    6 年前

    您也只能添加列 b c

    df[["b", "c"]] += np.where(df[["b", "c"]] > 0, 0.01, 0)
    

    我们使用 np.where 填写0作为旁路 np.nan 在数据中。

    AntonVBR有一种优雅的方式来选择需要的列。