在 pandas DataFrame 的每一列上调用一个函数

Calling a function on every column of a pandas DataFrame

我想比较两个样本的均值差异,下面用变量sample区分 pandas DataFrame:

import numpy as np
import pandas as pd

df = pd.DataFrame({'sample': np.random.choice([1, 2], 10, replace=True),
                   'x': np.random.uniform(size=100),
                   'y': np.random.normal(size=100),
                   'z': np.random.choice([1,5,7,3,9],100, replace=True})

导入后

from scipy import stats

我想使用函数

 stats.ttest_ind(s1, s2, equal_var = False)

df 中的每一列 z 上,使得 s1=df['sample'==1, z] 对应于样本 1 中列的子集,而 s2=df['sample'==2, z] 对应于 z 在示例 2 中。

对于一个变量,我可以使用:

stats.ttest_ind(df.ix[df['sample']==1, 'x'], df.ix[df['sample']==2, 'x'], equal_var= False)

我正在寻找一种同时对所有列执行此操作的方法。我怎样才能做到这一点?

在 df.columns

上使用 For 循环
import numpy as np
import pandas as pd
from scipy import stats

df = pd.DataFrame({'sample': np.random.choice([1, 2], 100, replace=True),
                   'x': np.random.uniform(size=100),
                   'y': np.random.normal(size=100),
                   'z': np.random.choice([1,5,7,3,9],100, replace=True)})

def ttest(x):
    y = stats.ttest_ind(df.ix[df['sample']==1, x], 
        df.ix[df['sample']==2, x], 
        equal_var= False)
    return y


for col in df.columns:
    print col, ttest(col)

输出:

sample (-inf, 0.0)
x (0.051257527331014435, 0.95922494541232151)
y (-1.8814017903969658, 0.063320355499510511)
z (-1.0033063682017582, 0.31819256215047681)