我有一个带有数字数据的Pandas DataFrame。对于每个非二进制列,我想识别大于其第99百分位数的值并创建一个布尔掩码,我稍后将使用它来删除具有异常值的行。
我正在尝试使用apply
方法创建此布尔掩码,其中df
是一个DataFrame,其数字数据大小为 a * b ,如下。
def make_mask(s):
if s.unique().shape[0] == 2: # If binary, return all-false mask
return pd.Series(np.zeros(s.shape[0]), dtype=bool)
else: # Otherwise, identify outliers
return s >= np.percentile(s, 99)
s_bool = df.apply(make_mask, axis=1)
不幸的是,s_bool
作为DataFrame输出,列数为两倍(即大小 a * (b * 2))。第一个 b 列被命名为1,2,3等,并且充满了空值。第二个 b 列似乎是预期的掩码。
为什么apply
方法会使DataFrame的大小加倍?不幸的是,Pandas apply documentation没有提供有用的线索。
答案 0 :(得分:1)
我不清楚为什么,但似乎问题是你要回归一个系列。这似乎适用于您的示例:
def make_mask(s):
if s.unique().shape[0] == 2: # If binary, return all-false mask
return np.zeros(s.shape[0], dtype=bool)
else: # Otherwise, identify outliers
return s >= np.percentile(s, 99)
您可以进一步简化代码,并使用raw=True
:
def make_mask(s):
if np.unique(s).size == 2: # If binary, return all-false mask
return np.zeros_like(s, dtype=bool)
else: # Otherwise, identify outliers
return s >= np.percentile(s, 99)