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

找到包含0值列的行,并将其设置为“无熊猫”

  •  1
  • krizajb  · 技术社区  · 6 年前

    数据:

    f a b
    5 0 1
    5 1 3
    5 1 3
    5 6 3
    5 0 0
    5 1 5
    5 0 0
    

    0 ,设置为 None 另一方面是个谜。

    df_o[(df_o['a'] == 0) & (df_o['d'] == 0)]
    # set a and b to None
    

    预期结果:

    f a b 
    5 0 1
    5 1 3
    5 1 3
    5 6 3
    5 None None
    5 1 5
    5 None None
    
    5 回复  |  直到 5 年前
        1
  •  4
  •   jezrael    6 年前

    如果使用数值 None 转换为 NaN 和整数到 float 按设计:

    df_o.loc[(df_o['a'] == 0) & (df_o['b'] == 0), ['a','b']] = None
    
    print (df_o)
         a    b
    0  0.0  1.0
    1  1.0  3.0
    2  1.0  3.0
    3  6.0  3.0
    4  NaN  NaN
    5  1.0  5.0
    6  NaN  NaN
    

    另一个解决方案 DataFrame.all True 每行s axis=1 :

    df_o.loc[(df_o[['a', 'b']] == 0).all(axis=1), ['a','b']] = None
    print (df_o)
         a    b
    0  0.0  1.0
    1  1.0  3.0
    2  1.0  3.0
    3  6.0  3.0
    4  NaN  NaN
    5  1.0  5.0
    6  NaN  NaN
    

    :

    print ((df_o[['a', 'b']] == 0))
           a      b
    0   True  False
    1  False  False
    2  False  False
    3  False  False
    4   True   True
    5  False  False
    6   True   True
    
    print ((df_o[['a', 'b']] == 0).all(axis=1))
    0    False
    1    False
    2    False
    3    False
    4     True
    5    False
    6     True
    dtype: bool
    
        2
  •  0
  •   Ankur Sinha    6 年前

    我能想到的一个办法就是这样。创建数据帧的额外副本,并在主数据帧上将该值设置为“无”时分别检查两者。不是最干净的解决方案,但是:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame()
    
    df['f'] = [5,5,5,5,5,5,5]
    df['a'] = [0,1,1,6,0,1,0]
    df['b'] = [1,3,3,3,0,5,0]
    
    df1 = df.copy()
    df['a'] = np.where((df.a == 0) & (df.b == 0), None, df.a)
    df['b'] = np.where((df1.a == 0) & (df1.b == 0), None, df.b)
    print(df)
    

       f     a     b
    0  5     0     1
    1  5     1     3
    2  5     1     3
    3  5     6     3
    4  5  None  None
    5  5     1     5
    6  5  None  None
    
        3
  •  0
  •   BAC83    6 年前

    df.replace(0, np.nan) --获取NaNs(可能更有用) df.replace(0, 'None') --你真正想要的

        4
  •  0
  •   Turbo_Penguin    6 年前

    这当然不是最优雅的方法,但也许这有帮助。

    import pandas as pd
    data = {'a': [0,1,1,6,0,1,0],
            'b':[1,3,3,3,0,5,0]}
    
    df_o = pd.DataFrame.from_dict(data)
    df_None = df_o[(df_o['a'] == 0) & (df_o['b'] == 0)]
    df_o.loc[df_None.index,:] = None
    print(df_o)
    

    输出:

        a    b
    0  0.0  1.0
    1  1.0  3.0
    2  1.0  3.0
    3  6.0  3.0
    4  NaN  NaN
    5  1.0  5.0
    6  NaN  NaN
    
        5
  •  0
  •   Omar Cusma Fait    6 年前

    我就是这样做的:

    import pandas as pd
    
    
    a = pd.Series([0, 1, 1, 6, 0, 1, 0])
    b = pd.Series([1, 3, 3, 3, 0, 5 ,0])
    
    data = pd.DataFrame({'a': a, 'b': b})
    
    
    v = [[data[i][j] for i in data] == [0, 0] for j in range(len(data['a']))]   # spot null rows
    
    a = [None if v[i] else a[i] for i in range(len(a))]
    b = [None if v[i] else b[i] for i in range(len(b))]
    
    data = pd.DataFrame({'a': a, 'b': b})
    
    
    print(data)
    

         a    b
    0  0.0  1.0
    1  1.0  3.0
    2  1.0  3.0
    3  6.0  3.0
    4  NaN  NaN
    5  1.0  5.0
    6  NaN  NaN