Select 列,它们的值是正常的

Select columns that their values are normal

我有一个包含多列的数据框,我的想法是仅过滤其值来自正态分布的列。

import pandas as pd
import numpy as np
from scipy import stats

N = 100
df = pd.DataFrame({'normal1': np.random.randn(N),
                   'unif': np.random.random(N), 
                   'normal2': np.random.randn(N), 
                   'normal3': np.random.randn(N), 
                   'unif2': np.random.random(N)})

在此示例中,只会选择列 normal1、normal2、normal3。 选择标准可以通过夏皮罗测试: stats.shapiro,其中,p 值大于 0.05 的列被选中。

您可以 apply 对每一列进行 shapiro 测试。返回的第二个元素是 p 值

from scipy.stats import shapiro

df.apply(shapiro).str[1]
#normal1    0.340504
#unif       0.000381
#normal2    0.117524
#normal3    0.731604
#unif2      0.002847
#dtype: float64

所以如果你想得到那些你可以在一个选择中链接:

df.apply(shapiro).str[1].loc[lambda x: x > 0.05].index
#Index(['normal1', 'normal2', 'normal3'], dtype='object')

df[df.apply(shapiro).str[1].loc[lambda x: x > 0.05].index].head(3)
#    normal1   normal2   normal3
#0  0.069468 -0.756850 -1.541968
#1 -0.253336  0.136242  1.927812
#2  3.176248  1.909514 -1.185512