根据值Pandas Dataframe获取所有其他列

时间:2018-06-08 14:34:31

标签: python pandas dataframe

假设我有以下df:

>  Name   A     B     C     D   
   John   Nan   1     2     Nan   
   Mike   2     Nan   Nan   Nan   
   Fred   Nan   5     6     7    
   Ana    3     Nan   3     2   
   Fran   2     Nan   1     1

我想要做的是对某些列进行排序,以便我只填充A列的每个人(在本例中为Mike):

> df_1 = df[(df['A'] > 0)&(~(df['A'] == 0))]

或者我只想填充两列(在这种情况下,没有):

df_1 = df[(df['A','B'] > 0)&(~(df['A','B'] == 0))]

我真的很喜欢这个。

TKS

1 个答案:

答案 0 :(得分:2)

isnull + all

您的语法不正确。您可以使用pd.DataFrame.isnull

mask1 = df['A'] > 0
mask2 = df[['B', 'C', 'D']].isnull().all(1)

df_1 = df_1[mask1 & mask2]

同样,对于您的第二个查询:

mask1 = (df[['A', 'B']] > 0).all(1)
mask2 = df[['C', 'D']].isnull().all(1)

df_1 = df_1[mask1 & mask2]

这假设您希望在mask1中明确过滤大于0的值。如果任何非空数字足够,您可以使用pd.DataFrame.notnull

不要害怕以这种方式将面具分成多行。它将使您的代码更清晰,更易于管理。

pipe + isnull + all

更一般地说,您可以编写一个函数来计算和应用布尔系列蒙版:

def masker(df, cols_required):

    """ Supply list cols_required. These must be > 0; others null. """

    mask1 = (df[cols_required] > 0).all(1)
    mask2 = df[df.columns.difference(cols_required)].isnull().all(1)
    return df[mask1 & mask2]

df = df.pipe(masker, cols_required=['A', 'B'])