【问题标题】:Pandas - Create a table with a "dummy variable"Pandas - 创建一个带有“虚拟变量”的表
【发布时间】:2018-05-27 11:37:19
【问题描述】:

假设我有这个数据框

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,在 car 等于美国的那一行中为零日语。

我已经编写了一些手动完成的代码(使用字典),但我想知道是否存在更简洁的解决方案。

(这是为了格式化数据以便在 Stata 下使用 asclogit/nlogit)

【问题讨论】:

    标签: python pandas stata


    【解决方案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.首先用1assign创建新列
    2.由set_index创建MultiIndex
    3.通过MultiIndex.from_product生成所有可能的组合并通过reindex创建新行
    4.然后将choice列中的NaNs替换为0
    5.Last通过转发和回填替换所有其他列中的NaNs。

    【讨论】:

      【解决方案2】:

      不确定您指的是随机二进制整数而不是“虚拟变量”。 “虚拟变量”通常用于将数值变量分配给非数值。 (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

      【讨论】:

      • 这不是我所期望的,但谢谢:)!我编辑了我的帖子并给出了更高的精度
      猜你喜欢
      • 2020-03-11
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2023-01-16
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多