有效地指定具有相同前缀的多个列名称
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有效地指定具有相同前缀的多个列名称相关的知识,希望对你有一定的参考价值。
我的观察是在公司层面进行回归。我想控制公司的类型[它产生什么]。我在一个对象变量中有这个信息,我变成了分类,然后从中获取虚拟变量。
df['Product Type'] = df['Product Type'].astype('category')
df = pd.get_dummies(df, columns=['Product Type']).head()
我的样本非常大,我最终得到了很多虚拟变量。将它们逐个引入我的模型中可能需要做很多工作(可能有10-15个)。
reg = sm.OLS(endog=df['Y'], exog= df[['X1', 'Number of workers', 'X2', "Product Type_Jewellery", "Product_Type_Apparel", (all the other product dummies) ]], missing='drop')
有没有更有效的方法来做到这一点?在stata中,我使用了前缀i.Product_Type,它会向软件发出信号,表明String变量必须被视为一个类别......类似的东西?
答案
使用str.contains
查找包含“Product_ *”的列,访问它们变得很容易。
c = df.columns[df.columns.str.contains('Product')]
如果不需要正则表达式,则可以将c
初始化为
c = df.columns[df.columns.str.contains('Product', regex=False)]
或者,使用str.startswith
:
c = df.columns[df.columns.str.startswith('Product')]
或者,列表理解:
c = [c_ for c_ in df if c_.startswith('Product')]
最后,通过解压缩c
来访问子集:
subset = df[['X1', 'Number of workers', 'X2', *c]]
reg = sm.OLS(endog=df['Y'], exog=subset, missing='drop')
另一答案
同样的想法,就像使用filter
提供的冷
sm.OLS(endog=df['Y'],
exog=df.filter(regex=r'X1|X2|Number|Product'),
missing='drop')
另一答案
使用statsmodels.formula.api
你不需要自己生成假人。从列名中删除空格,并使用C(col_name)
引用Categorical列
import statsmodels.formula.api as smf
df = df.rename(columns={'Product Type': 'Product_Type',
'Number of workers': 'Number_of_workers'})
results = smf.ols(formula = 'Y ~ X1 + X2 + Number_of_workers + C(Product_Type)',
data=df, missing='drop').fit()
样本数据
import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame({'Y': np.random.randint(1,100,200),
'X1': np.random.normal(1,20,200),
'X2': np.random.normal(-10,1,200),
'Number of workers': np.arange(1,201,1)/10,
'Product Type': np.random.choice(list('abcde'), 200)})
results.summary()
的输出
========================================================================================
coef std err t P>|t| [0.025 0.975]
----------------------------------------------------------------------------------------
Intercept 69.2836 23.105 2.999 0.003 23.711 114.856
C(Product_Type)[T.b] 11.3334 6.941 1.633 0.104 -2.356 25.023
C(Product_Type)[T.c] 1.3745 6.943 0.198 0.843 -12.321 15.070
C(Product_Type)[T.d] 2.0430 6.258 0.326 0.744 -10.300 14.386
C(Product_Type)[T.e] 3.8445 6.273 0.613 0.541 -8.528 16.217
X1 0.0207 0.113 0.184 0.854 -0.202 0.243
X2 1.4677 2.177 0.674 0.501 -2.825 5.761
Number_of_workers -0.5803 0.369 -1.573 0.117 -1.308 0.147
==============================================================================
注意,使用公式api,因为你的products
创建了一个完整的基础,它将自动删除其中一个类别,因为我们有拦截,类似于你在stata中找到的。
以上是关于有效地指定具有相同前缀的多个列名称的主要内容,如果未能解决你的问题,请参考以下文章
在列表中有效地重复data.table,从循环中的另一个data.table顺序替换具有相同名称的列
自动创建一个视图,该视图将所有其他具有相同名称但不同前缀和不同模式的视图联合起来