给出以下数据框:
>>> pd.DataFrame(data=[['a',1],['a',2],['b',3],['b',4],['c',5],['c',6],['d',7],['d',8],['d',9],['e',10]],columns=['key','value'])
key value
0 a 1
1 a 2
2 b 3
3 b 4
4 c 5
5 c 6
6 d 7
7 d 8
8 d 9
9 e 10
我正在寻找一种可以根据键值更改结构的方法,如下所示:
a b c d e
0 1 3 5 7 10
1 2 4 6 8 10 <- 10 is duplicated
2 2 4 6 9 10 <- 10 is duplicated
结果行号是最长的组数(在上面的示例中为d),而丢失的值是最后一个可用值的重复项。
答案 0 :(得分:4)
用set_index
创建MultiIndex
,用计数器计数器cumcount
创建,用unstack
整形,用ffill
重新填充最后的非缺失值,最后转换如有必要,所有数据发送到integer
:
df = df.set_index([df.groupby('key').cumcount(),'key'])['value'].unstack().ffill().astype(int)
具有自定义lambda函数的另一种解决方案:
df = (df.groupby('key')['value']
.apply(lambda x: pd.Series(x.values))
.unstack(0)
.ffill()
.astype(int))
print (df)
key a b c d e
0 1 3 5 7 10
1 2 4 6 8 10
2 2 4 6 9 10
答案 1 :(得分:2)
使用pivot
和groupby
+ cumcount
df.assign(key2=df.groupby('key').cumcount()).pivot('key2','key','value').ffill().astype(int)
Out[214]:
key a b c d e
key2
0 1 3 5 7 10
1 2 4 6 8 10
2 2 4 6 9 10