1

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

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列。选择标准可以通过 shapiro 检验: stats.shapiro,其中选择 p 值大于 0.05 的列。

4

1 回答 1

1

您可以applyshapiro每一列进行测试。返回的第二个元素是 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
于 2020-07-29T18:16:45.593 回答