假设我有这个数据框
id | car | sex | income
-------------------------------
1 | European | Male | 45000
2 | Japanese | Female | 48000
3 | American | Male | 53000
有没有一种简单的方法来创建这个(使用熊猫)?
| 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
这个想法是在基础中获得“汽车”变量的每种模态,并指出每个人通过“选择”变量选择了哪一个。例如,在第一个表格中,id
1的人选择了欧洲汽车,因此choice
在car
为欧洲的行中等于1,在行中为0 car
等于美国或日本。
我已经编写了一些手动操作的东西(使用字典),但我想知道是否存在更清晰的解决方案。
(这样做的目的是格式化数据,以便在Stata下使用asclogit / nlogit)
答案 0 :(得分:2)
我认为需要:
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.首先使用assign
的1
创建新列
2.按set_index
创建MultiIndex
3.按MultiIndex.from_product
生成所有可能的组合,并按reindex
创建新行
4.然后将NaN
替换为0
列中的choice
5.通过前进和回填最后替换所有其他列中的NaN
。
答案 1 :(得分:0)
不确定是否指的是随机二进制整数而不是“虚拟变量”。 '虚拟变量'通常用于将数值变量分配给非数值。 (Dummy Variables)
如果您尝试将随机二进制整数分配给新的空列,则可以使用numpy.random.rand
(Numpy.random.rand)
举个例子:
df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'],'C': [1, 2, 3]})
A B C
0 a b 1
1 b a 2
3 a c 3
df['randNumCol'] = np.random.randint(0,1, size=len(df))
A B C randNumCol
0 a b 1 0
1 b a 2 1
3 a c 3 0
指定随机整数范围为0,1