Python Pandas DataFrame: заменить значения в каждой строке для каждого столбца в зависимости от условий - PullRequest
1 голос
/ 10 марта 2020

У меня есть следующий набор данных (проверьте ссылку ниже):

Акции возвращаются с 2006 по 2018

Мне нужно присвоить значения для возврата акций каждой компании в каждом году в 4 квантилях (проверьте ссылку ниже).

Распределенная доходность запасов с 2006 по 2018 год

df = pd.read_excel('data.xlsx', sheet_name=['Excess Returns'], index_col='Data')
df = pd.concat(df[frame] for frame in df.keys())
df = df.replace('-', '')
df = (df).apply(pd.to_numeric, errors='coerce')

Не могли бы вы помочь написать цикл сортировки?

Следующий код не работает :

for i in range(0, df.shape[0]):
    if df.iloc[i] <= df.quantile(0.2, axis = 1).iloc[i]:
        df.iloc[i] = 1
    elif df.iloc[i] > (df.quantile(0.2, axis = 1) and df.iloc[i] <= df.quantile(0.4, axis = 1)).iloc[i]:
        df.iloc[i] = 2
    elif df.iloc[i] > (df.quantile(0.4, axis = 1) and df.iloc[i] <= df.quantile(0.6, axis = 1)).iloc[i]:
        df.iloc[i] = 3
    elif df.iloc[i] > (df.quantile(0.6, axis = 1) and df.iloc[i] <= df.quantile(0.8, axis = 1)).iloc[i]:
        df.iloc[i] = 4
    else:
        df.iloc[i] = 5

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Моя идея основана на предыдущих участниках. Я чувствую, что это вполне оптимальное решение:

df = pd.DataFrame(np.where(df <= df.quantile(0.2), 1, np.where((df > df.quantile(0.2)) & \
                                                     (df <= df.quantile(0.4)), 2, \
                                                     np.where((df > df.quantile(0.4)) & \
                                                     (df <= df.quantile(0.6)), 3, 4)), columns=df.columns)


1 голос
/ 10 марта 2020

Вы можете попробовать что-то вроде этого -

import pandas as pd, numpy as np
quantiles_0.75 = pd.DataFrame(np.where(df<=df.quantile([0.75]).loc[0.75], 1, 2), columns=df.columns])

Обратите внимание, что приведенное выше создаст кадр данных quantiles_0.75 с теми же столбцами, что и df, но со значениями в соответствии с правилом, которое вы указали.

В случае большего количества условий, я думаю, измененная версия сообщения @ David также будет полезна, если вы хотите получить результат в кадре данных -

temp = pd.DataFrame(np.where(df <= df.quantile(0.2), 1, np.where((df > df.quantile(0.2)) & \
                                                 (df <= df.quantile(0.4)), 2, \
                                                 np.where((df > df.quantile(0.4)) & \
                                                 (df <= df.quantile(0.6)), 3, 4)), columns=df.columns)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...