Pandas DataFrame应用DataFrame的功能倍增大小

时间:2015-04-28 14:35:30

标签: python function pandas apply

我有一个带有数字数据的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没有提供有用的线索。

1 个答案:

答案 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)