这是我想要做的:
>>>import pandas as pd
>>>dftemp = pd.DataFrame({'a': [1] * 3 + [2] * 3, 'b': 'a a b c d e'.split()})
a b
0 1 a
1 1 a
2 1 b
3 2 c
4 2 d
5 2 e
6 3 f
如何对按列“ a”分组的“ b”列进行转置,以使输出如下所示:
a b0 b1 b2
0 1 a a b
3 2 c d e
6 3 f NaN NaN
答案 0 :(得分:3)
将pivot_table
与cumcount
一起使用:
(df.assign(flag=df.groupby('a').b.cumcount())
.pivot_table(index='a', columns='flag', values='b', aggfunc='first')
.add_prefix('B'))
flag B0 B1 B2
a
1 a a b
2 c d e
3 f NaN NaN
答案 1 :(得分:1)
您可以尝试按列分组并展平与group关联的值,然后将其重新构造为数据框
df = df.groupby(['a'])['b'].apply(lambda x: x.values.flatten())
pd.DataFrame(df.values.tolist(),index=df.index).add_prefix('B')
出局:
B0 B1 B2
a
1 a a b
2 c d e
3 f None None
答案 2 :(得分:0)
您可能可以尝试这样的事情:
>>> dftemp = pd.DataFrame({'a': [1] * 3 + [2] * 2 + [3]*1, 'b': 'a a b c d e'.split()})
>>> dftemp
a b
0 1 a
1 1 a
2 1 b
3 2 c
4 2 d
5 3 e
>>> dftemp.groupby('a')['b'].apply(lambda df: df.reset_index(drop=True)).unstack()
0 1 2
a
1 a a b
2 c d None
3 e None None
答案 3 :(得分:0)
根据DataFrame
的顺序,您可以找到组的更改位置,然后使用np.split
创建新的DataFrame
。
import numpy as np
import pandas as pd
splits = dftemp[(dftemp.a != dftemp.a.shift())].index.values
df = pd.DataFrame(np.split(dftemp.b.values, splits[1:])).add_prefix('b').fillna(np.NaN)
df['a'] = dftemp.loc[splits, 'a'].values
b0 b1 b2 a
0 a a b 1
1 c d e 2
2 f NaN NaN 3