使用pandas或statsmodel创建虚拟变量,以实现两列

时间:2017-07-12 11:27:17

标签: python pandas statsmodels patsy

我有一个这样的数据框:

Index ID  Industry  years_spend       asset
6646  892         4            4  144.977037
2347  315        10            8  137.749138
7342  985         1            5  104.310217
137    18         5            5  156.593396
2840  381        11            2  229.538828
6579  883        11            1  171.380125
1776  235         4            7  217.734377
2691  361         1            2  148.865341
815   110        15            4  233.309491
2932  393        17            5  187.281724

我想为Industry X years_spend创建虚拟变量,创建len(df.Industry.value_counts()) * len(df.years_spend.value_counts())变量,例如d_11_4 = 1,对于行业== 1和年度花费= 4的所有行,否则d_11_4 = 0.然后我可以使用这些变量用于某些回归工作。

我知道我可以使用df.groupby([' Industry',' years_spend'])制作我想要的群组,我知道我可以使用一列创建这样的变量patsy中的statsmodels语法:

import statsmodels.formula.api as smf

mod = smf.ols("income ~   C(Industry)", data=df).fit()

但是如果我想要处理2列,我会收到一个错误: IndexError: tuple index out of range

如何使用pandas或在statsmodels中使用某些功能?

2 个答案:

答案 0 :(得分:3)

使用patsy语法只是:

import statsmodels.formula.api as smf

mod = smf.ols("income ~ C(Industry):C(years_spend)", data=df).fit()

:字符表示“互动”;您还可以将此概括为两个以上项目(C(a):C(b):C(c))的互动,数字和分类值之间的互动等。您可能会找到patsy docs useful

答案 1 :(得分:2)

您可以执行以下操作:首先必须创建一个封装Industryyears_spend的计算字段:

df = pd.DataFrame({'Industry': [4, 3, 11, 4, 1, 1], 'years_spend': [4, 5, 8, 4, 4, 1]})
df['industry_years'] = df['Industry'].astype('str') + '_' + df['years_spend'].astype('str')  # this is the calculated field

以下是df的样子:

   Industry  years_spend industry_years
0         4            4            4_4
1         3            5            3_5
2        11            8           11_8
3         4            4            4_4
4         1            4            1_4
5         1            1            1_1

现在您可以申请get_dummies

df = pd.get_dummies(df, columns=['industry_years'])

那就能得到你想要的东西:)