2016-01-22 68 views
2

我有一个大约有370列的数据框。我正在测试一系列要求我使用模型的子集来拟合三次回归模型的假设。我正在计划使用statsmodels来模拟这些数据。更有效的方式来表示在熊猫数据框中居中列的子集并保留列名称

多项式回归过程的一部分涉及平均居中变量(从特定特征的每种情况中减去均值)。

我可以用3行代码做到这一点,但它似乎效率低下,因为我需要复制这个过程的半打假设。请记住,我需要从statsmodel输出的系数级数据,所以我需要保留列名。

这是对数据的窥视。 这是我为我的一个假设测试所需的列的子集。

 i we you shehe they ipron 
0 0.51 0 0 0.26 0.00 1.02 
1 1.24 0 0 0.00 0.00 1.66 
2 0.00 0 0 0.00 0.72 1.45 
3 0.00 0 0 0.00 0.00 0.53 

这是代表中心并保留列名称的代码。

from sklearn import preprocessing 
#create df of features for hypothesis, from full dataframe 
h2 = df[['i', 'we', 'you', 'shehe', 'they', 'ipron']] 

#center the variables 
x_centered = preprocessing.scale(h2, with_mean='True', with_std='False') 

#convert back into a Pandas dataframe and add column names 
x_centered_df = pd.DataFrame(x_centered, columns=h2.columns) 

任何关于如何使这个更高效/更快的建议将会非常棒!

回答

2
df.apply(lambda x: x-x.mean()) 

%timeit df.apply(lambda x: x-x.mean()) 
1000 loops, best of 3: 2.09 ms per loop 

df.subtract(df.mean()) 

%timeit df.subtract(df.mean()) 
1000 loops, best of 3: 902 µs per loop 

都产生:

 i we you shehe they ipron 
0 0.0725 0 0 0.195 -0.18 -0.145 
1 0.8025 0 0 -0.065 -0.18 0.495 
2 -0.4375 0 0 -0.065 0.54 0.285 
3 -0.4375 0 0 -0.065 -0.18 -0.635 
+0

非常感谢! lambda函数效果很好。 Python解决方案非常简单...我总是认为他们会比他们总是变得更复杂。 再次感谢! –

+0

你知道为什么我从这种手术中获得的意义不是零? –

+0

如果它非常接近于零(如e-15),那么它就是浮动表示。如果它真的与零不同,那么其他的东西就会关闭。例如尝试:np.random.seed(42) values = np.random.randint(-100,100,50) np.mean(values -np.mean(values)),得到3.97903932026e-15。 – Stefan

相关问题