按功能与熊猫数据集分组 Cronbach的Alpha与Python中的分组数据集

问题描述

假设我有一个数据集(sim_data),其中包含16个变量,包括心理数据(问卷中的15个项目),第一列是类别变量(国家/地区)。

我可以使用以下方式轻松地按组获取均值/标准差:

sim_data.groupby("country").describe()

但是,我想使用此数据从特定软件包(pip install pingouin和(import pingouin as pg)中应用特定函数(Cronbach的alpha),并按组获取结果(就像我之前所做的那样)。以下代码不起作用。

pg.cronbach_alpha(sim_data.groupby("country"))

这都不是

sim_data.groupby('country').apply(lambda grp: pg.cronbach_alpha())

重要说明:

我正在改编here中的代码

如果您想复制,那就是我的例程和数据集

import pandas as pd
import numpy as np
import pingouin as pg
from numpy import nan

sim_data = pd.DataFrame.from_dict({'country': {33003: 'Vietnam',12172: 'Macedonia',5192: 'Ghana',32511: 'Vietnam',7813: 'Ghana',21440: 'Armenia',32912: 'Vietnam',20609: 'Georgia',7751: 'Ghana',31228: 'Laos',36230: 'Serbia',32025: 'Laos',21758: 'Armenia',35730: 'Serbia',8444: 'Kenya',19946: 'Georgia',37532: 'Serbia',22926: 'Armenia',27204: 'Sri_Lanka',31959: 'Laos',24535: 'Sri_Lanka',19433: 'Georgia',17137: 'Ukraine',26103: 'Sri_Lanka',33878: 'Vietnam',39053: 'Philippines',33799: 'Vietnam',37183: 'Serbia',3606: 'Colombia',2561: 'Colombia',29960: 'Laos',32397: 'Vietnam',39539: 'Philippines',431: 'Bolivia',36842: 'Serbia',16926: 'Ukraine',9287: 'Kenya',34246: 'Vietnam',16277: 'Ukraine',34105: 'Vietnam',11032: 'Kenya',41457: 'Philippines',34380: 'Vietnam',19482: 'Georgia',1844: 'Bolivia',9552: 'Kenya',35437: 'Vietnam',29555: 'Laos',29993: 'Laos',28114: 'Yunnan',15: 'Bolivia',27712: 'Yunnan',12313: 'Macedonia',11631: 'Kenya'},'step_bfi1_ab_cor': {33003: 1.8333332538604736,12172: 1.5,5192: nan,32511: 1.4166666269302368,7813: nan,21440: 2.4166665077209473,32912: 1.0,20609: 4.0,7751: 0.5,31228: 2.25,36230: 2.9375,32025: 1.875,21758: 3.9166665077209473,35730: 2.25,8444: 3.5833334922790527,19946: 2.3333334922790527,37532: 4.0625,22926: 3.5,27204: 4.083333492279053,31959: 3.0,24535: 3.5,19433: 2.0833334922790527,17137: 3.25,26103: 1.1666666269302368,33878: 1.6666667461395264,39053: 1.75,33799: 0.75,37183: 3.375,3606: 4.25,2561: 2.8333334922790527,29960: 4.25,32397: 3.8333332538604736,39539: 2.5625,431: 3.25,36842: 3.8125,16926: 1.9166667461395264,9287: 2.3333334922790527,34246: 1.0,16277: 2.9166667461395264,34105: 1.5833333730697632,11032: 1.75,41457: 3.75,34380: 1.5833332538604736,19482: 0.9166666269302368,1844: 3.6666667461395264,9552: 2.25,35437: 1.0833332538604736,29555: 2.25,29993: 4.25,28114: 3.6666665077209473,15: 3.0,27712: 3.25,12313: 2.0833334922790527,11631: 2.5833334922790527},'step_bfi3_ab_cor': {33003: 3.8333332538604736,12172: 3.5,32511: 3.4166665077209473,21440: 3.4166665077209473,32912: 3.0,7751: 2.5,31228: 4.25,36230: 3.6875,32025: 3.875,8444: 4.583333492279053,37532: 2.5625,22926: 2.5,27204: 3.0833334922790527,31959: 4.0,24535: 2.5,19433: 3.0833334922790527,26103: 3.1666665077209473,33878: 3.6666667461395264,39053: 2.5,33799: 3.75,29960: 3.25,32397: 2.8333332538604736,36842: 3.0625,16926: 3.9166667461395264,9287: 3.3333334922790527,34246: 4.0,16277: 1.9166667461395264,34105: 3.5833334922790527,11032: 3.75,41457: 2.25,34380: 2.5833332538604736,19482: 3.9166665077209473,1844: 2.6666667461395264,9552: 3.25,35437: 3.0833332538604736,29993: 2.25,27712: 2.25,12313: 4.083333492279053,11631: 3.5833334922790527},'step_bfi5_ab_cor': {33003: 0.8333332538604736,12172: 0.5,32511: 2.4166665077209473,32912: 2.0,20609: 2.0,31228: 3.25,8444: 1.5833333730697632,19946: 1.3333333730697632,37532: 1.8125,22926: 1.5,27204: 2.0833334922790527,24535: 1.5,19433: 1.0833333730697632,17137: 2.25,26103: 4.166666507720947,33799: 1.75,3606: 2.25,2561: 1.8333333730697632,32397: 1.8333332538604736,431: 1.25,9287: 1.3333333730697632,34246: 3.0,11032: 2.75,19482: 1.9166666269302368,9552: 1.25,29555: 1.25,29993: 3.25,28114: 2.6666665077209473,15: 2.0,12313: 1.0833333730697632,'step_bfi6_ab_cor': {33003: 4.1666669845581055,32511: 1.5833333730697632,21440: 2.5833334922790527,32912: 4.0,20609: 3.0,7751: 1.5,31228: 2.75,36230: 2.8125,32025: 4.125,21758: 4.083333492279053,35730: 1.25,8444: 3.4166665077209473,19946: 2.6666665077209473,37532: 3.9375,27204: 2.9166665077209473,31959: 2.0,19433: 2.9166665077209473,17137: 2.75,26103: 0.8333333730697632,33878: 4.3333330154418945,33799: 4.25,37183: 3.125,3606: 2.75,2561: 3.1666665077209473,29960: 3.75,32397: 1.1666667461395264,39539: 3.9375,431: 1.75,36842: 2.6875,16926: 2.0833332538604736,9287: 2.6666665077209473,16277: 2.0833332538604736,34105: 2.4166665077209473,11032: 3.25,41457: 4.25,34380: 2.4166667461395264,19482: 4.083333492279053,1844: 3.3333332538604736,9552: 2.75,35437: 2.9166667461395264,29555: 1.75,29993: 2.75,28114: 3.3333334922790527,27712: 1.75,12313: 2.9166665077209473,11631: 3.4166665077209473},'step_bfi7_ab_cor': {33003: 1.8333332538604736,35730: 3.75,8444: 2.5833334922790527,31959: 1.0,26103: 2.1666665077209473,33878: 2.6666667461395264,39053: 3.25,29960: 2.25,39539: 4.0625,34246: 2.0,19482: 2.9166665077209473,1844: 1.6666667461395264,35437: 2.0833332538604736,27712: 1.25,'step_bfi10_ab_cor': {33003: 3.8333332538604736,7751: 3.5,19946: 4.333333492279053,24535: 0.4999999403953552,34105: 2.5833334922790527,34380: 3.5833332538604736,11631: 4.583333492279053},'step_bfi17_ab_cor': {33003: 2.8333332538604736,21440: 1.4166666269302368,20609: 1.0,36230: 2.1875,32025: nan,19433: 4.083333492279053,33799: 2.75,2561: 0.8333333730697632,36842: 2.3125,16926: 2.9166667461395264,12313: 3.0833334922790527,'step_bfi19_ab_cor': {33003: 3.1666667461395264,36230: 2.0625,32025: 2.125,21758: 1.0833333730697632,35730: 4.25,19946: 3.6666665077209473,37532: 0.9375,26103: 1.8333333730697632,33878: 3.3333332538604736,33799: 3.25,29960: 1.75,32397: 3.1666667461395264,39539: 2.4375,16926: 3.0833332538604736,9287: 4.666666507720947,34105: 3.4166665077209473,41457: 2.75,19482: 3.0833334922790527,1844: 4.3333330154418945,29993: 1.75,27712: 2.75,12313: 0.9166666269302368,11631: 2.4166665077209473},'step_bfi23_ab_cor': {33003: 1.1666667461395264,32511: 4.583333492279053,21440: 3.5833334922790527,7751: 4.5,36230: 3.5625,26103: 3.8333334922790527,33878: 1.3333332538604736,33799: 2.25,37183: 4.625,29960: 2.75,431: 3.75,36842: 3.4375,9287: 1.6666666269302368,16277: 3.0833332538604736,34105: 1.4166666269302368,11032: 4.25,9552: 3.75,35437: 1.9166667461395264,29555: 2.75,15: 4.0,'step_bfi30_ab_cor': {33003: 1.8333332538604736,39053: 1.0,15: 1.0,'step_bfi32_ab_cor': {33003: 3.8333332538604736,32025: 2.875,37532: 3.3125,37183: 1.875,29555: 3.25,'step_bfi33_ab_cor': {33003: 1.8333332538604736,17137: 1.25,39539: 3.3125,431: 2.25,'step_bfi34_ab_cor': {33003: 3.8333332538604736,19946: 3.3333334922790527,3606: 1.25,2561: 3.8333334922790527,'step_bfi36_ab_cor': {33003: 2.8333332538604736,21758: 1.9166666269302368,9287: 0.3333333730697632,'step_bfi39_ab_cor': {33003: 4.1666669845581055,31228: 3.75,36230: 4.3125,32025: 1.125,35730: 2.75,37532: 2.4375,26103: 2.8333334922790527,37183: 1.625,3606: 3.75,39539: 0.9375,431: 2.75,16277: 4.0833330154418945,34105: 4.416666507720947,11032: 2.25,41457: 1.25,19482: 1.0833333730697632,9552: 1.75,35437: 3.9166667461395264,11631: 2.4166665077209473}})

我是R的重度用户,正在将以下代码翻译为python

sim_data %>%
  select('step_bfi1_ab_cor':'step_bfi39_ab_cor',"country") %>%
  nest(-country) %>%
  mutate(result=map(data,~psych::alpha(.)$total)) %>%
  select(country,result) %>%
  unnest()

欢迎提出建议。请让我知道是否还有另一种方法(更优雅)来解决我的问题。 谢谢

解决方法

通常,基数R(而不是整齐的R)更容易翻译成Python Pandas。您的R代码似乎正在做的是通过 country 列对数据框进行分组,然后将每个子集运行到psych::alpha()中。然后将提取的统计信息返回到带有国家指标的数据框中。

您可以对基数R的by进行完全相同的操作,它可以在列表理解中转换为熊猫的groupby。看来psych::alpha返回的统计信息比pingouin.cronbach_alpha多。在未经测试的代码中根据需要调整字段并在下面返回值。

基本R (使用docs

# DEFINE METHOD
run_cronbach_alpha <- function(sub) {
    results <- psych::alpha(sub)$total    # RETURNS LIST
                      
    data.frame(country = sub$country[1],raw_alpha = results$raw_alpha,std.alpha = results$std.alpha,G6 = results$G6,average_r = results$average_r,median_r = results$median,mean = results$mean,sd = results$sd)
 }


# FILTER COLUMNS IN DATA FRAME
sim_short <- sim_data[c("step_bfi1_ab_cor",...,"step_bfi39_ab_cor","country")] 

# RUN METHOD BY COUNTRY SUBSETS TO RETURN DF LIST
results_df_list <- by(sim_short,sim_short$country,run_cronbach_alpha)

# ROW BIND ALL DFs TO SINGLE FINAL DATA FRAME
results_df <- do.call(rbind.data.frame,results_df_list)

Python熊猫 (使用docs

# DEFINE METHOD
def run_cronbach_alpha(c,sub):
    results = pg.cronbach_alpha(sub.drop(["country"],axis="columns"))    # RETURNS TUPLE

    return pd.DataFrame({'country': c,'cronbach_alpha': results[0],index=[0]})


# FILTER COLUMNS IN DATA FRAME
sim_short = sim_data.reindex(["step_bfi1_ab_cor","country"],axis='columns')
                         
# RUN METHOD BY COUNTRY SUBSETS TO RETURN DF LIST
results_df_list = [run_cronbach_alpha(i,df) for i,df in sim_short.groupby("country")]

# CONCATENATE ALL DFs TO SINGLE FINAL DATA FRAME
results_df = pd.concat(results_df_list)
,

我刚刚改编了@Parfait的答案(谢谢!),现在可以了。

def run_cronbach_alpha(c,axis="columns"))    # RETURNS TUPLE
    return pd.DataFrame({'country': c,'cronbach_alpha': results[0]},index = ["Result"])
                       
# RUN METHOD BY COUNTRY SUBSETS TO RETURN DF LIST
results_df_list = [run_cronbach_alpha(i,df in sim_data.groupby("country")]
results_df_list