有效地指定具有相同前缀的多个列名称

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顺序替换具有相同名称的列

熊猫中具有相同名称的多个列

自动创建一个视图,该视图将所有其他具有相同名称但不同前缀和不同模式的视图联合起来

如何根据非常大的df中的名称有效地将唯一ID分配给具有多个条目的个人

具有列的多个可能名称的DataTable

Python:在相同索引上加入具有相同列前缀的两个 DataFrame