Получение среднего / медианы / режима / квартиля / квантиля в каждом столбце с помощью функции - PullRequest
0 голосов
/ 23 сентября 2018

Я новичок в ноутбуке jupyter, и мне интересно, как получить квантиль столбца внутри функции:

DataFrame:

num_likes | num_post | ... | 
464.0     | 142.0    | ... |
364.0     | 125.0    | ... |
487.0     | 106.0    | ... |
258.0     | 123.0    | ... |
125.0     | 103.0    | ... |

myFunction:

def myFunction(x):
    q22 = dataframe["num_likes"].quantile(0.22)
    q45 = dataframe["num_likes"].quantile(0.45)
    qc = q45 - q22
    k = 3

    if x >= q45 + k * qc:
        return q45 + k * qc
    elif x <= q22 - k * qc:
        return q22 - k * qc

Прямо сейчас, так как я не знаю, как его получить, я запустил функцию для каждого столбца, который у меня есть.Кроме того, я попытался запустить его, и кажется, что он не работает

data["num_likes"].apply(lambda x : myFunction(x))[:5]

Кроме того, результат, кажется, неверный, так как я не видел никаких результатов

    num_likes | num_post | ... | 
    NaN       | None     | ... |
    NaN       | None     | ... |
    NaN       | None     | ... |
    NaN       | None     | ... |
    NaN       | None     | ... |

1 Ответ

0 голосов
/ 24 сентября 2018

Причина, по которой вы получаете None, заключается в том, что ни один из путей вашего блока if-elseif не возвращает true, поэтому myFunction возвращает None.Вы имели в виду if-else?

Кроме того, чтобы очистить то, что у тебя есть, я бы сделал немного иначе.Первые q22, q45 и qc нужно вычислять только один раз (на основе логики выше), и они могут быть переданы в функцию, а не вычисляться каждый раз в функции.Во-вторых, вам не нужно создавать lambda в этой ситуации, apply ( docs ) принимает вызываемый Python (ваша функция), и можно передавать дополнительные аргументы, как показано ниже.

df = pd.DataFrame({
    'num_likes': [464.0, 364.0, 487.0, 258.0, 125.0],
    'num_post': [142.0, 125.0, 106.0, 123.0, 103.0]
})

def myFunction(x, q22, q45, qc):
    k = 3

    if x >= q45 + k * qc:
        return q45 + k * qc
    elif x <= q22 - k * qc:
        return q22 - k * qc
    else:
        return -1

q22 = df["num_likes"].quantile(0.22)
q45 = df["num_likes"].quantile(0.45)
qc = q45 - q22

# pass additional arguments in an tuple, they will be passed to myFunction
df.num_likes.apply(myFunction, args=(q22, q45, qc))

# this will return a series which can be assigned to new column
# 0   -1
# 1   -1
# 2   -1
# 3   -1
# 4   -1
# Name: num_likes, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...