如何在具有重复键的Pandas中旋转此数据帧?

2024-09-29 04:31:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据框,创建如下:

df = pd.DataFrame({
                   'rank': ['1', '1', '1', '1', '2', '2'],
                   'name': ['bob', 'rick', 'bob', 'rick', 'randy', 'billy'],
                   'position': ['sanitation', 'washer', 'sanitation', 'washer', 'sanitation', 'washer']
                  })

这将生成如下所示的数据帧:

我希望能够操纵数据帧,使其最终看起来像这样:

基本上,我希望在所有位置用完后,重复的排名出现在新行上

当我尝试这个:

pivot = df.pivot_table(values='name', index='rank', columns='position')

我得到一个错误“DataError:没有要聚合的数值类型”

无论如何,我不确定这是否有效,因为我选择“排名”作为索引,我并不真的想在排名上建立索引。一旦职位列表用完,我希望在新的一行中重复排名

有什么想法吗?谢谢


Tags: 数据namedataframepandasdfpositionpdbob
3条回答
#Here you go with cumcount create the additional key
d['key']=d.groupby(['name','position']).cumcount()
p = d.pivot_table(index=['key','name'], columns = 'type', 
values='rank',aggfunc='sum').reset_index()
p

您可以使用groupby().cumcount()分配相对排名,然后使用pivot_table

df['idx'] = df.groupby(['rank', 'position']).cumcount()

(df.pivot_table(index=['rank','idx'], columns='position', 
               values='name', aggfunc='first')
   .reset_index('idx', drop=True)               # remove the extra `idx`
   .reset_index()                               # make rank a column
 )

输出:

position rank sanitation washer
0           1        bob   rick
1           1        bob   rick
2           2      randy  billy
df = pd.DataFrame({
                   'rank': ['1', '1', '1', '1', '2', '2'],
                   'name': ['bob', 'rick', 'bob', 'rick', 'randy', 'billy'],
                   'position': ['sanitation', 'washer', 'sanitation', 'washer', 'sanitation', 'washer']
                  })
df.head()

DataFrame.reset_索引 与set_索引相反

DataFrame.reindex 更改为新索引或扩展索引

DataFrame.reindex_-like 更改为与其他数据帧相同的索引

将索引设置为“排名”列:

df.set_index('rank')
df.head()

相关问题 更多 >