【问题标题】:Categorical variables into multiple columns分类变量分为多列
【发布时间】:2018-11-24 12:13:17
【问题描述】:

我有带有分类变量 Segment 的数据框

ID  Segment Var
1   AAA     1
2   BBB     0
3   BBB     1
4   AAA     1
5   CCC     1
6   AAA     0 
7   AAA     1
8   AAA     0
9   BBB     0
10  CCC     0

我想将列 Segment 转换为 3 类,如下所示:

ID  SegmentAAA  SegmentBBB  SegmentCCC
1   1           null        null
2   null        0           null
3   null        1           null
4   1           null        null
5   null        null        1
6   0           null        null
7   1           null        null
8   0           null        null
9   null        0           null
10  null        null        0

你能帮我解决这个问题吗?非常感谢。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    那是支点吗?

    df.pivot(*df.columns)
    Out[70]: 
    Segment  AAA  BBB  CCC
    ID                    
    1        1.0  NaN  NaN
    2        NaN  0.0  NaN
    3        NaN  1.0  NaN
    4        1.0  NaN  NaN
    5        NaN  NaN  1.0
    6        0.0  NaN  NaN
    7        1.0  NaN  NaN
    8        0.0  NaN  NaN
    9        NaN  0.0  NaN
    10       NaN  NaN  0.0
    

    【讨论】:

    • 噢……这对我来说是一个新技巧。解压列以进行旋转。出色的短手代码。我喜欢它。
    • @ScottBoston 谢谢你
    【解决方案2】:

    用途:

    df.set_index(['ID','Segment'])['Var']\
      .unstack()\
      .add_prefix('Segment')\
      .rename_axis([None], axis=1)\
      .reset_index()
    

    输出:

       ID  SegmentAAA  SegmentBBB  SegmentCCC
    0   1         1.0         NaN         NaN
    1   2         NaN         0.0         NaN
    2   3         NaN         1.0         NaN
    3   4         1.0         NaN         NaN
    4   5         NaN         NaN         1.0
    5   6         0.0         NaN         NaN
    6   7         1.0         NaN         NaN
    7   8         0.0         NaN         NaN
    8   9         NaN         0.0         NaN
    9  10         NaN         NaN         0.0
    

    选项 2:

    pd.crosstab(df.ID,df.Segment,df.Var,aggfunc='first')
    

    【讨论】:

    • 非常感谢您的快速帮助。我使用了第二个选项。我可以问你我怎样才能为更多的细分列做到这一点? (例如 Segment1、Segment2、Segment3 等)我试过了,但它不起作用: pd.crosstab(df.ID,df.Segment,[col for col in df.columns if 'Segm' in col],aggfunc='第一个')
    • 您可以重塑数据框并将所有这些 Segment 列堆叠成一列并执行相同操作。如果要使用适当的数据创建一个新问题,我们将看看什么是最有效的。
    【解决方案3】:
    pd.get_dummies(df).drop('Var', axis=1)
    

    【讨论】:

    • 这个方法会不会混淆什么是零和什么是空?空值在哪里?
    【解决方案4】:

    Pivot 将是最佳选择。如果您不希望 ID 成为索引并按指示获取列名,这比 Wen 的回答更具体

    df.pivot(index='ID',columns='Segment',values='Var').add_prefix('Segment').reset_index()
    Segment  ID  SegmentAAA  SegmentBBB  SegmentCCC
    0         1         1.0         NaN         NaN
    1         2         NaN         0.0         NaN
    2         3         NaN         1.0         NaN
    3         4         1.0         NaN         NaN
    4         5         NaN         NaN         1.0
    5         6         0.0         NaN         NaN
    6         7         1.0         NaN         NaN
    7         8         0.0         NaN         NaN
    8         9         NaN         0.0         NaN
    9        10         NaN         NaN         0.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2017-08-02
      • 2021-09-19
      相关资源
      最近更新 更多