根据其他列ID值创建新列-Pandas

时间:2020-05-03 20:17:15

标签: 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   55      123   431
74237   742     444   234

3 个答案:

答案 0 :(得分:3)

groupbyunstack一起使用:

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

答案 1 :(得分:1)

如果您拥有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')

enter image description here

答案 2 :(得分:0)

除了已经提供的出色答案之外:

(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