在 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)
我想比较两个样本的均值差异,下面用变量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)