假设我有以下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
答案 0 :(得分:2)
您的语法不正确。您可以使用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
。
不要害怕以这种方式将面具分成多行。它将使您的代码更清晰,更易于管理。
更一般地说,您可以编写一个函数来计算和应用布尔系列蒙版:
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'])