Как повторить ту же задачу на 30 фреймах данных - Python Pandas - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующий фрейм данных (называется aa1 ):

d = {'Index' : pd.Series([25, 7, 7, 5, 5, 8])}
aa1 = pd.DataFrame(d)

Я создал новый столбец с именем Quartile_Index , который оценивает квартиль для значений столбца Index (примечание: это было лучшее решение, которое я мог найти, поскольку библиотека pd.qcut не позволяет иметь дублирующиеся ребра бина):

quantile_frame = aa1.quantile(q=[0.25, 0.5, 0.75])
quantile_ranks = []
for index, row in aa1.iterrows():
    if (row['Index'] <= quantile_frame.ix[0.25]['Index']):
        quantile_ranks.append('q1')
    elif (row['Index'] >= quantile_frame.ix[0.25]['Index'] and row['Index'] <= quantile_frame.ix[0.5]['Index']):
        quantile_ranks.append('q2')
    elif (row['Index'] >= quantile_frame.ix[0.5]['Index'] and row['Index'] <= quantile_frame.ix[0.75]['Index']):
        quantile_ranks.append('q3')
    else:
        quantile_ranks.append('q4')

aa1['Quartile_Index'] = quantile_ranks

Это лучшее решение, которое я могу придумать, но мне нужна помощь с двумя вопросами для дальнейшей оптимизации моего кода / логики:

  1. Есть ли более простой способ вызвать квартильный столбец с более простым кодом? pd.qcut не позволяет вам иметь повторяющиеся края корзины, так что это не решение.

  2. Мне нужно произвести выполнение столбца квантиля в 30 других фреймах данных панд ( aa1 , aa2, aa3 и т. Д.). Я не хочу повторять это 30 раз, так есть ли решение? Я пока еще не настолько продвинут с петлями.

1 Ответ

0 голосов
/ 04 июля 2018

Решение для циклического перебора кадров данных (с использованием iloc вместо .ix []):

data = [aa1,aa2]
for i in data:
    quantile_frame = i.quantile(q=[0.25, 0.5, 0.75])
    quantile_ranks = []
    for index, row in i.iterrows():
        if (row['Index'] <= quantile_frame.iloc[0]['Index']):
            quantile_ranks.append('q1')
        elif (row['Index'] >= quantile_frame.iloc[0]['Index'] and row['Index'] <= quantile_frame.iloc[1]['Index']):
            quantile_ranks.append('q2')
        elif (row['Index'] >= quantile_frame.iloc[1]['Index'] and row['Index'] <= quantile_frame.iloc[2]['Index']):
            quantile_ranks.append('q3')
        else:
            quantile_ranks.append('q4')
    i['Quartile_Index'] = quantile_ranks
...