如何将数据框值“透视”到列中

Posted

技术标签:

【中文标题】如何将数据框值“透视”到列中【英文标题】: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 应该是真假。我还在学习支点。请指出正确的方向。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何将数据框值“透视”到列中的主要内容,如果未能解决你的问题,请参考以下文章

如何将Python Dask Dataframes合并到列中?

如何使用R [list]将列表的名称插入到列中

动态透视行到列-SQL 服务器

将多个值添加到列中 - Pandas

具有两行到列的数据透视表

将数据集参数添加到列中,以便稍后通过 DataPrep 在 BigQuery 中使用它们