pandas -使用虚拟变量&创建一个表
问题描述
假设我有这个数据帧
id | car | sex | income
-------------------------------
1 | European | Male | 45000
2 | Japanese | Female | 48000
3 | American | Male | 53000
有没有简单的方法来创建这个(使用 pandas )?
| id | car | choice | sex | income
1.| 1 | European | 1 | Male | 45000
2.| 1 | American | 0 | Male | 45000
3.| 1 | Japanese | 0 | Male | 45000
| ----------------------------------------
4.| 2 | European | 0 | Female | 48000
5.| 2 | American | 0 | Female | 48000
6.| 2 | Japanese | 1 | Female | 48000
| ----------------------------------------
7.| 3 | European | 0 | Male | 53000
8.| 3 | American | 1 | Male | 53000
9.| 3 | Japanese | 0 | Male | 53000
其思想是在基数中获取"car"变量的每种形态,并通过"Choose"变量指示每个人选择了哪一种。例如,在第一个表中,id
1的人选择了一辆欧洲汽车,因此choice
在car
是欧洲车的行中等于1,在car
等于美国车或日本车的行中等于零。
我已经手动编写了一些代码(使用词典),但我想知道是否存在更干净的解决方案。
(这是为了格式化数据以便在Stata下使用aslogit/nlogit)
解决方案
我认为需要:
df = df.assign(choice = 1).set_index(['id','car'])
df = df.reindex(pd.MultiIndex.from_product(df.index.levels, names=df.index.names))
df = (df.assign(choice=df['choice'].fillna(0).astype(int))
.groupby(level=0).apply(lambda x: x.ffill().bfill())
.reset_index())
print (df)
id car sex income choice
0 1 American Male 45000.0 0
1 1 European Male 45000.0 1
2 1 Japanese Male 45000.0 0
3 2 American Female 48000.0 0
4 2 European Female 48000.0 0
5 2 Japanese Female 48000.0 1
6 3 American Male 53000.0 1
7 3 European Male 53000.0 0
8 3 Japanese Male 53000.0 0
说明:
1.首先使用1
byassign
创建新列
2.MultiIndex
创建者set_index
3.按
MultiIndex.from_product
生成所有可能的组合并按reindex
创建新行4.然后将
choice
列中NaN
替换为0
5.最后将其他所有列中的NaN
替换为正向和回填。
相关文章