Python - неоднозначное значение истинности ряда в dask dataframe - PullRequest
0 голосов
/ 30 сентября 2019

Я использую приведенный ниже код для обнаружения и распечатывания любых выбросов в наборе данных:

outliers = []
fields = ['Nums']

nums_df = dd.read_csv("data/mydata.csv", usecols=fields, dtype=float)

def detect_outliers(df):
    threshold = 3
    mean = np.mean(df)
    std = np.std(df)

    for index in df.iterrows():
        z_score = (index - mean) / std
        if abs(z_score) > threshold:
            outliers.append(index)
    return outliers

outliers = detect_outliers(nums_df)

print(outliers)

Это приводит к следующей ошибке ValueError: The truth value of a Series is ambiguous. Use a.any() or a.all().

Добавление любого () или all () в операторе if исправляет ошибку, но неудивительно, что возвращает неверный результат. Как я должен оценивать индивидуальность значения истинности каждой строки, чтобы решить, соответствует ли она порогу для выброса или нет?

РЕДАКТИРОВАТЬ: Попытка использовать iterseries() для Серии, возвращенной iterrows(), по-прежнему выдает ошибку: ValueError: Metadata inference failed in sub. AssertionError(<class 'tuple'>,)

for index, series in df.iterrows():
    for s_index in series.iteritems():
        z_score = (s_index - mean) / std
        if abs(z_score) > threshold:
            outliers.append(s_index)
return outliers

1 Ответ

1 голос
/ 01 октября 2019

Причиной возникновения ошибки может быть то, что mean и std не являются значениями, а Series объектами.

Однако в вашем случае вам не нужночтобы перебрать строки, просто создайте серию, используя pandas мощный синтаксис.

import pandas as pd
import numpy as np

df = pd.DataFrame({"Nums": np.random.random(10)})
mean = np.mean(df["Nums"])
std = np.std(df["Nums"])
threshold = 0.8
df["outliers"] = (df["Nums"] - mean)/std > threshold

outliers = df[df["outliers"]]
print(outliers)
...