我有一个带有IDs列的DataFrame和几个包含数据的列,例如本例中的“值”列。
对于此DataFrame,我想将与同一id对应的所有值移动到行中的新列,如下所示:
我猜想有一个相反的功能可以“融化”,但是我没有得到如何旋转这个DF的信息。
输入和输出DF的格是:
d = {"id":[1,1,1,2,2,3,3,4,5],"value":[12,13,1,22,21,23,53,64,9]}
d2 = {"id":[1,2,3,4,5],"value1":[12,22,23,64,9],"value2":[1,21,53,"","",],"value3":[1,"","","",""]}
答案 0 :(得分:2)
通过cumcount
创建MultiIndex
,通过unstack
重塑形状,并通过add_prefix
添加更改列名称:
df = (df.set_index(['id',df.groupby('id').cumcount()])['value']
.unstack()
.add_prefix('value')
.reset_index())
print (df)
id value0 value1 value2
0 1 12.0 13.0 1.0
1 2 22.0 21.0 NaN
2 3 23.0 53.0 NaN
3 4 64.0 NaN NaN
4 5 9.0 NaN NaN
可以用fillna
替换缺少的值,但是将数字和字符串数据混合在一起,因此某些函数应该失败:
df = (df.set_index(['id',df.groupby('id').cumcount()])['value']
.unstack()
.add_prefix('value')
.reset_index()
.fillna(''))
print (df)
id value0 value1 value2
0 1 12.0 13 1
1 2 22.0 21
2 3 23.0 53
3 4 64.0
4 5 9.0
答案 1 :(得分:1)
您可以GroupBy
到列表,然后展开一系列列表:
df = pd.DataFrame(d) # create input dataframe
res = df.groupby('id')['value'].apply(list).reset_index() # groupby to list
res = res.join(pd.DataFrame(res.pop('value').values.tolist())) # expand lists to columns
print(res)
id 0 1 2
0 1 12 13.0 1.0
1 2 22 21.0 NaN
2 3 23 53.0 NaN
3 4 64 NaN NaN
4 5 9 NaN NaN
通常,由于列数是任意的,因此此类操作将很昂贵。当您可以预分配内存时,Pandas / NumPy解决方案最有效,这在这里是不可能的。