Pandas数据框架透视

3

我有一个如下的pandas DataFrame

            id               quantity  cost  type
2016-06-18  1700057817       2         2383  A
2016-06-18  1700057817       1         744   B
2016-06-19  1700057817       5         934   A

在这里,日期是 index。我需要将表格透视如下:
            id          A-quantity  A-cost  B-quantity  B-cost
2016-06-18  1700057817  2           2383    1           744
2016-06-19  1700057817  5           934     NA          NA

目前我尝试过的方法:

我尝试了很多次使用 pivot。这是我最接近成功的尝试:

>>> df.pivot(index='id', columns='type')

            quantity   cost               
type         A    B     A     B  
id                              
1700057817   2    1     2383  744

以下是问题:

  1. date 索引已经消失
  2. 我需要每个 date-id 组合的一行

我也阅读了几篇关于SO和其他地方的文章,包括这篇文章

2个回答

2
您可以使用append=True设置set_index,然后使用unstack并保留MultiIndex
df.set_index(['id', 'type'], append=True).unstack()

在这里输入图片描述

或者强制重新格式化成您要求的样式:

# step-one same as above
df1 = df.set_index(['id', 'type'], append=True).unstack()
# collapse MultiIndex columns into '-' separated string
df1.columns = df1.columns.swaplevel(0, 1).to_series().str.join('-')
# move 'Id' from the index back into dataframe proper
df1 = df1.reset_index(1)
df1

enter image description here


1
你可以使用 reset_index 来保留日期。
df.index.name = 'date'
df = df.reset_index().pivot_table(index=['date', 'id'], columns=['type'])
df = df.sort_index(axis=1, level=1)
df.columns = ['-'.join(tup[::-1]) for tup in df.columns]

不确定是否是一个错误,但是 pivot_table 似乎会丢弃非数字列。因此,如果您添加一个字符串列“customer”,它将被丢弃。 - jf328
哦,因为 pivot_table 尝试聚合,即使您的值长度为 1。所以 pivot_table(index, columns, aggfunc = lambda x: x.values[0]) 将获取字符串。 - jf328

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接