【问题标题】:How to 'pivot' a dataframe's values into columns如何将数据框值“透视”到列中
【发布时间】:2018-06-18 09:53:18
【问题描述】:

我正在尝试转换数据框

df = pd.DataFrame({
'c1': ['x','y','z'],
'c2': [[1,2,3],[1,3],[2,4]]})

看起来像

    c1  c2
0   x   [1, 2, 3]
1   y   [1, 3]
2   z   [2, 4]

进入

p = pd.DataFrame({
    'c1': ['x','y','z'],
    1: [1,1,0],
    2: [1,0,1],
    3: [1,1,0],
    4: [0,0,1]
})

看起来像

    c1  1   2   3   4
0   x   1   1   1   0
1   y   1   0   1   0
2   z   0   1   0   1

值 1 和 0 应该是真假。我还在学习支点。请指出正确的方向。

【问题讨论】:

    标签: python pandas dataframe data-analysis data-science


    【解决方案1】:

    你可以使用:

    from sklearn.preprocessing import MultiLabelBinarizer
    
    mlb = MultiLabelBinarizer()
    
    df1 = pd.DataFrame(mlb.fit_transform(df['c2']),columns=mlb.classes_, index=df.index)
    
    df = df.drop('c2', 1).join(df1)
    print (df)
    
      c1  1  2  3  4
    0  x  1  1  1  0
    1  y  1  0  1  0
    2  z  0  1  0  1
    

    另一种解决方案:

    df1 = df['c2'].apply(lambda x: '|'.join([str(y) for y in x])).str.get_dummies()
    
    df = df.drop('c2', 1).join(df1)
    print (df)
      c1  1  2  3  4
    0  x  1  1  1  0
    1  y  1  0  1  0
    2  z  0  1  0  1
    

    编辑:

    感谢MaxU 的好建议:

    df = df.join(pd.DataFrame(mlb.fit_transform(df.pop('c2')),
                              columns‌​=mlb.classes_, 
                              index=df.index))
    

    【讨论】:

    • 是的,我认为 MultiLabelBinarizer 在这种情况下是最惯用的方法。我们可以一行完成:df = df.join(pd.DataFrame(mlb.fit_transform(df.pop('c2')),columns=mlb.classes_, index=df.index))
    • @MaxU - 谢谢。
    【解决方案2】:

    你可以使用

    In [235]: df.join(pd.DataFrame([{x: 1 for x in r} for r in df.c2]).fillna(0))
    Out[235]:
      c1         c2    1    2    3    4
    0  x  [1, 2, 3]  1.0  1.0  1.0  0.0
    1  y     [1, 3]  1.0  0.0  1.0  0.0
    2  z     [2, 4]  0.0  1.0  0.0  1.0
    

    详情

    In [236]: pd.DataFrame([{x: 1 for x in r} for r in df.c2]).fillna(0)
    Out[236]:
         1    2    3    4
    0  1.0  1.0  1.0  0.0
    1  1.0  0.0  1.0  0.0
    2  0.0  1.0  0.0  1.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多