df = pd.DataFrame({'Col1': ['label1', 'label1', 'label2', 'label2',
'label3', 'label3', 'label4'],
'Col2': ['a', 'd', 'b', 'e', 'c', 'f', 'q']}, columns=['Col1', 'Col2'])
看起来像这样
Col1 Col2
0 label1 a
1 label1 d
2 label2 b
3 label2 e
4 label3 c
5 label3 f
6 label4 q
对于Col1
中的唯一值,我想将列的唯一值转换为列。从某种意义上说,我试图将“{1}}值”取消堆叠为列标题,行值将是Col1
中的值。我的关键主要问题是我没有计算任何数字数据 - 它都是文本 - 而我只是想重塑结构。
这是理想的结果:
Col2
我尝试过: label1 label2 label3 label4
0 a b c q
1 d e f NaN
,stack
,unstack
,pd.melt
,pivot_table
。
这个ALMOST让我在那里,但并不完全,而且看起来并不简洁:
pivot
This question shows how to do it with a pivot table ..但我的情况下的数字索引不是我关心的。
This question shows how to also do it with a pivot table ..使用aggfunc df.groupby('Col1').apply(lambda x: x['Col2'].values).to_frame().T
Col1 label1 label2 label3 label4
0 [a, d] [b, e] [c, f] [q]
或first
,但会返回CSV而不是各行的值。
答案 0 :(得分:6)
您可以使用cumcount
为新index
创建列,然后使用汇总join
的{{3}}:
df['g'] = df.groupby('Col1')['Col1'].cumcount()
print (df.pivot_table(index='g', columns='Col1', values='Col2', aggfunc=''.join))
Col1 label1 label2 label3 label4
g
0 a b c q
1 d e f None
感谢您发表评论pivot_table
:
df['g'] = df.groupby('Col1')['Col1'].cumcount()
print (df.pivot(index='g', columns='Col1', values='Col2'))
Col1 label1 label2 label3 label4
g
0 a b c q
1 d e f None
或者:
print (pd.pivot(index=df.groupby('Col1')['Col1'].cumcount(),
columns=df['Col1'],
values=df['Col2']))
Col1 label1 label2 label3 label4
0 a b c q
1 d e f None
答案 1 :(得分:0)
使用set_index
和unstack
,您可以
In [17]: df.set_index([df.groupby('Col1')['Col1'].cumcount(), 'Col1'])['Col2'].unstack()
Out[17]:
Col1 label1 label2 label3 label4
0 a b c q
1 d e f None
详细
In [18]: df
Out[18]:
Col1 Col2
0 label1 a
1 label1 d
2 label2 b
3 label2 e
4 label3 c
5 label3 f
6 label4 q