Python 熊猫-创建一个带有“熊猫”的表格;虚拟变量";
假设我有这个数据帧Python 熊猫-创建一个带有“熊猫”的表格;虚拟变量";,python,pandas,stata,Python,Pandas,Stata,假设我有这个数据帧 id | car | sex | income ------------------------------- 1 | European | Male | 45000 2 | Japanese | Female | 48000 3 | American | Male | 53000 有没有一个简单的方法来创建这个(使用熊猫) 这样做的目的是将“car”变量的每一个模态都放在基础上,并通过“choice”变量指示每个人选择了哪一个。例如,在第一个
id | car | sex | income
-------------------------------
1 | European | Male | 45000
2 | Japanese | Female | 48000
3 | American | Male | 53000
有没有一个简单的方法来创建这个(使用熊猫)
这样做的目的是将“car”变量的每一个模态都放在基础上,并通过“choice”变量指示每个人选择了哪一个。例如,在第一个表中,id为1的人选择了一辆欧洲车,因此choice
在car
为欧洲车的行中等于1,在car
为美国车或日本车的行中等于0
我已经编写了一些手动操作的代码(使用字典),但我想知道是否存在更干净的解决方案
(其目的是格式化数据,以便在Stata下使用asclogit/nlogit)不确定您指的是随机二进制整数,而不是“伪变量”“虚拟变量”通常用于将数值变量分配给非数值。()
如果试图将随机二进制整数分配给新的空列,可以使用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的范围,我认为需要:
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
by
2.通过
3.通过生成所有可能的组合,并通过创建新行
4.然后将choice
列中的NaN
s替换为0
5.通过向前和回填替换所有其他列中的最后一个NaN
s 这不是我所期望的,但谢谢:)!我编辑了我的帖子,并给出了更精确的答案
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