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
我有一个包含多列的数据框,我的想法是仅过滤其值来自正态分布的列。
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