Python 基于表中唯一行值的数量添加新列

Python 基于表中唯一行值的数量添加新列,python,pandas,pivot,pivot-table,Python,Pandas,Pivot,Pivot Table,我有一个结构如下的数据框: ID | Name | Role 1 | John | Owner 1 | Bob | Driver 2 | Jake | Owner 2 | Tom | Driver 2 | Sally | Owner 3 | Mary | Owner 3 | Sue | Driver 我希望透视Role列并将Name列作为值,但由于某些ID(本例中的索引)的所有者角色中有多个人,而有些ID则没有,透视表函数无法工作。是否有一种方法可以为特定ID可能拥有的每个其他所有者创建一

我有一个结构如下的数据框:

ID | Name | Role  
1 | John | Owner
1 | Bob | Driver
2 | Jake | Owner
2 | Tom | Driver
2 | Sally | Owner
3 | Mary | Owner
3 | Sue | Driver
我希望透视Role列并将Name列作为值,但由于某些ID(本例中的索引)的所有者角色中有多个人,而有些ID则没有,透视表函数无法工作。是否有一种方法可以为特定ID可能拥有的每个其他所有者创建一个新列。有些可能有2,3,4+个所有者。谢谢

样本输出如下:

ID | Owner_1 | Owner_2 | Driver
1 | John | NaN | Bob 
2 | Jake | Sally | Tom 
3 | Mary | NaN | Sue 
这就是我所尝试的:

pd.pivot_table(df,values='Name',index='ID',columns='Role')

DataError: No numeric types to aggregate

您可以使用
cumcount
为每个ID中的重复项创建附加键,然后我们可以简单地使用
pivot

df.Role=df.Role+'_'+df.groupby(['ID','Role']).cumcount().add(1).astype(str)
df.pivot('ID','Role','Name')
Out[432]: 
Role Driver_1 Owner_1 Owner_2
ID                           
1         Bob    John    None
2         Tom    Jake   Sally
3         Sue    Mary    None

您需要将默认聚合函数从
mean
更改为
sum

pivoted = pd.pivot_table(df, values='Name', 
                         index='ID', columns='Role', aggfunc='sum')
#Role  Driver          Owner
#ID                         
#1       Bob           John 
#2       Tom    Jake  Sally 
#3       Sue           Mary 
现在,一些所有者被表示为多字字符串。把它们分成几个单词:

result = pivoted.join(pivoted['Owner'].str.split().apply(pd.Series))\
       .drop("Owner", axis=1)
#    Driver     0      1
#ID                     
#1     Bob   John    NaN
#2     Tom   Jake  Sally
#3     Sue   Mary    NaN

result.columns = "Driver", "Owner_1", "Owner_2"

谢谢-这正是我工作的目的。工作得很漂亮!谢谢-这也有道理。尽管如此,我发现我的数据集在某些情况下也有多个驱动程序