Pandas数据框转动

时间:2016-07-20 07:22:23

标签: python pandas dataframe

我有以下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组合
  3. 我还浏览了几篇关于SO和其他地方的文章,包括this one

2 个答案:

答案 0 :(得分:2)

set_index append=True后跟unstack并保留MultiIndex

df.set_index(['id', 'type'], append=True).unstack()

enter image description here

或强行重新格式化您的要求:

# 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 :(得分: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]