Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-创建一个带有“熊猫”的表格;虚拟变量";_Python_Pandas_Stata - Fatal编程技术网

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