如何将数据框值“透视”到列中
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
【讨论】:
以上是关于如何将数据框值“透视”到列中的主要内容,如果未能解决你的问题,请参考以下文章