如何调用变量中所有唯一值以简化代码?

-2 投票
2 回答
54 浏览
提问于 2025-04-14 16:59

我有一个数据集。一开始,我想检查一下所有有缺失值的列(比如死亡率、死亡人数、发病率和艾滋病病例)的正常性。我尝试用这段代码(df3是这个数据集的框架):

from scipy.stats import shapiro
norm_dr= shapiro(df3["AIDS_Death_Rate"].dropna())
norm_d= shapiro(df3["AIDS_Death"].dropna())
norm_inc= shapiro(df3["HIV_Incidence_Rate"].dropna())
norm_nc= shapiro(df3["New_HIV_Cases"].dropna())
print("normality for aids death rate: ", norm_dr,
     "normality for aids death: ", norm_d,
     "normality for incidence: ", norm_inc,
     "normality for new cases: ", norm_nc)

虽然这段代码运行得很好,但我觉得写下所有列名真是太费劲了。这些列是顺序排列在一起的,所以我想我可以试试这样的写法:

norm= shaphiro (df3[3:6).dropna())
print(norm)

但是没有成功。

2 个回答

0

你可以像这样遍历列

norm = {}
for k in df3.columns[3:7]:
    norm[k] = shaphiro(df3[k].dropna())
2

你可以用一种叫做列表推导的方法,来创建一个你想检查正态性的列名列表,然后通过这个列表逐个调用shapiro函数来检查每一列。下面是具体的做法:

from scipy.stats import shapiro

cols_to_check = ["AIDS_Death_Rate", "AIDS_Death", "HIV_Incidence_Rate", "New_HIV_Cases"]

normality_results = []
for col in cols_to_check:
    normality_results.append(shapiro(df3[col].dropna()))

for col, result in zip(cols_to_check, normality_results):
    print(f"Normality for {col}: {result}")

如果你想用更简洁的方式来实现这个,而不需要逐个列出所有的列名,你可以利用DataFrame的columns属性来获取所有列名的列表,然后根据一些条件筛选出你想要的列。下面是具体的做法:

from scipy.stats import shapiro

cols_with_missing = [col for col in df3.columns if df3[col].isnull().any()]

normality_results = []
for col in cols_with_missing:
    normality_results.append(shapiro(df3[col].dropna()))

for col, result in zip(cols_with_missing, normality_results):
    print(f"Normality for {col}: {result}")

这种方法可以动态地识别出有缺失值的列,并对这些列进行正态性测试,而不需要你手动列出列名。如果你已经知道需要进行标准化的列,可以相应地设置cols_to_check。比如,cols_to_check = df3.columns[2:6]

撰写回答