【问题标题】:pandas groupby transpose str columnpandas groupby 转置 str 列
【发布时间】:2018-10-06 16:12:50
【问题描述】:
这是我想要做的:
>>>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
【问题讨论】:
标签:
python
pandas
dataframe
pivot
transpose
【解决方案1】:
将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
【解决方案2】:
您可以尝试按列分组并将与组关联的值展平并将其重新构建为数据框
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
【解决方案3】:
你可以试试这样的:
>>> 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
【解决方案4】:
根据您的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