在熊猫的新列中的行中移动值

时间:2018-10-03 08:31:16

标签: python pandas dataframe

我有一个带有IDs列的DataFrame和几个包含数据的列,例如本例中的“值”列。

enter image description here

对于此DataFrame,我想将与同一id对应的所有值移动到行中的新列,如下所示:

enter image description here

我猜想有一个相反的功能可以“融化”,但是我没有得到如何旋转这个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,"","","",""]}

2 个答案:

答案 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解决方案最有效,这在这里是不可能的。