Список Pandas фреймов данных: выходы функции объединения - PullRequest
1 голос
/ 05 марта 2020

Я исследовал предыдущие похожие вопросы , но не смог найти подходящих потенциальных клиентов:

У меня есть фрейм данных, называемый "df", который примерно структурирован следующим образом:

    Income  Income_Quantile Score_1 Score_2 Score_3
0   100000  5                75        75    100
1   97500   5                80        76    94
2   80000   5                79        99    83
3   79000   5                88        78    91
4   70000   4                55        77    80
5   66348   4                65        63    57
6   67931   4                60        65    57
7   69232   4                65        59    62
8   67948   4                64        64    60
9   50000   3                66        50    60
10  49593   3                58        51    50
11  49588   3                58        54    50
12  48995   3                59        59    60
13  35000   2                61        50    53
14  30000   2                66        35    77
15  12000   1                22        60    30
16  10000   1                15        45    12

Используя столбец «Income_Quantile» и последующее «for-l oop», я разделил фрейм данных на список из 5 поднаборов фреймов данных (каждый из которых содержит наблюдения из одного и того же квантиля дохода):

dfs = []

for level in df.Income_Quantile.unique():
    df_temp = df.loc[df.Income_Quantile == level]
    dfs.append(df_temp)

Теперь я хотел бы применить следующую функцию для вычисления корреляции Спирмена, p-значения и t-statisti c к кадру данных (функции fyi: scipy.stats используются в основной функции) :

def create_list_of_scores(df):

    df_result = pd.DataFrame(columns=cols)
    df_result.loc['t-statistic'] = [ttest_ind(df['Income'], df[x])[0] for x in cols]
    df_result.loc['p-value'] = [ttest_ind(df['Income'], df[x])[1] for x in cols]
    df_result.loc['correlation'] = [spearmanr(df['Income'], df[x])[1] for x in cols]

    return df_result

Функции, которые использует "create_list_of_scores", то есть "ttest_ind" и "ttest_ind", доступны из scipy.stats следующим образом:

  • из scipy.stats import ttest_ind
  • из scipy.stats import spearmanr

Я протестировал функцию на одном подмножестве фрейма данных:

data = dfs[1]
result = create_list_of_scores(data)

Работает, как и ожидалось.

Однако, когда я Пришло время применить эту функцию ко всему списку данных всего , "dfs", возникает много проблем. Если я применю его к списку фреймов данных следующим образом:

result = pd.concat([create_list_of_scores(d) for d in dfs], axis=1)

Я получу вывод в виде столбцов «Score_1, Score_2 и Score_3» x 5.

Я хотел бы:

  • Всего три столбца: "Score_1, Score_2 и Score_3".
  • Индексируйте выходные данные, используя t-statisti c, p-значение и корреляции в качестве индекса первого уровня. , а также; «Income_Quantile» как индекс второго уровня.

Вот что я имею в виду:

                  Score_1  Score_2  Score_3
t-statistic 1           
            2           
            3           
            4           
            5           
p-value     1           
            2           
            3           
            4           
            5           
correlation 1           
            2           
            3           
            4           
            5           

Любая идея о том, как я могу объединить вывод своей функции в соответствии с запросом

1 Ответ

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

Я думаю, лучше использовать GroupBy.apply:

cols = ['Score_1','Score_2','Score_3']
def create_list_of_scores(df):

    df_result = pd.DataFrame(columns=cols)
    df_result.loc['t-statistic'] = [ttest_ind(df['Income'], df[x])[0] for x in cols]
    df_result.loc['p-value'] = [ttest_ind(df['Income'], df[x])[1] for x in cols]
    df_result.loc['correlation'] = [spearmanr(df['Income'], df[x])[1] for x in cols]
    return df_result

df = df.groupby('Income_Quantile').apply(create_list_of_scores).swaplevel(0,1).sort_index()
print (df)
                                  Score_1       Score_2       Score_3
            Income_Quantile                                          
correlation 1                         NaN           NaN           NaN
            2                         NaN           NaN           NaN
            3                6.837722e-01  0.000000e+00  1.000000e+00
            4                4.337662e-01  6.238377e-01  4.818230e-03
            5                2.000000e-01  2.000000e-01  2.000000e-01
p-value     1                8.190692e-03  8.241377e-03  8.194933e-03
            2                5.887943e-03  5.880440e-03  5.888611e-03
            3                3.606128e-13  3.603267e-13  3.604996e-13
            4                5.584822e-14  5.587619e-14  5.586583e-14
            5                3.861801e-06  3.862192e-06  3.864736e-06
t-statistic 1                1.098143e+01  1.094719e+01  1.097856e+01
            2                1.297459e+01  1.298294e+01  1.297385e+01
            3                2.391611e+02  2.391927e+02  2.391736e+02
            4                1.090548e+02  1.090479e+02  1.090505e+02
            5                1.594605e+01  1.594577e+01  1.594399e+01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...