Python 基于其他列id值创建新列-熊猫

Python 基于其他列id值创建新列-熊猫,python,pandas,dataset,Python,Pandas,Dataset,如何基于其他列id值创建新列 数据如下所示 value id 551 54089 12 54089 99 54089 55 73516 123 73516 431 73516 742 74237 444 74237 234 74237 v1 v2 v3 54089 551 12 99 73516

如何基于其他列id值创建新列

数据如下所示

value       id
551        54089
12         54089
99         54089
55         73516
123        73516
431        73516
742        74237
444        74237
234        74237

         v1     v2    v3
54089   551     12    99
73516   55      123   431
74237   742     444   234

我希望数据集看起来像这样

value       id
551        54089
12         54089
99         54089
55         73516
123        73516
431        73516
742        74237
444        74237
234        74237

         v1     v2    v3
54089   551     12    99
73516   55      123   431
74237   742     444   234


groupby
unstack
一起使用:

df = df.groupby('id')['value'].apply(lambda x: pd.Series(x.tolist(), 
                                                         index=['v1', 'v2', 'v3']))\
                              .unstack()
# or

df.groupby('id')['value'].apply(lambda x: pd.DataFrame(x.tolist(), 
                                                       index=['v1', 'v2', 'v3']).T)

print(df)
        v1   v2   v3
id                  
54089  551   12   99
73516   55  123  431
74237  742  444  234

如果您有3个以上的值,您可以创建一个小助手,它可以适应数据帧的大小

import pandas as pd
import numpy as np


#Dummy Dataframe
 np.random.seed(2016)
 df = pd.DataFrame({'id': 
[54089, 54089, 54089, 73516, 73516, 73516, 73516, 74237, 74237,74237],
                    'value': np.random.randint(1, 100, 10)})
#Create group
grp = df.groupby('id')

#Create helper column 
 df['ID_Count'] = grp['value'].cumcount() + 1

 #Pivot dataframe using helper column and add 'value' column to pivoted output.
 df_out = df.pivot('id','ID_Count','value').add_prefix('v')

对已经提供的优秀答案的补充:

(df.astype({'value':str})
 .groupby('id')
 .agg(','.join)
 .value.str.split(',',expand=True)
 .set_axis(['v1','v2','v3'],axis=1)
 .astype(int)
)

        v1  v2  v3
id          
54089   551 12  99
73516   55  123 431
74237   742 444 234