如何将数据框的值“旋转”到列中

时间:2018-01-09 11:10:51

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

我正在尝试转换数据框

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应该是真和假。我还在学习枢轴。请指出我正确的方向。

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

您可以使用

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