Pandas Dataframe Reshape / Pivot - 索引错误中的重复值

时间:2017-03-05 18:39:03

标签: pandas pivot

我正在使用Python 2.7和Pandas 0.19.2

我已经看过这个问题的一些类似的问题/答案,但仍然无法解决。

我有以下数据框:

          Date         name      objects
0   2005-11-17         Pete        6
1   2014-02-04         Rob         3
2   2012-02-13         Rob         2
3   2004-12-16         Julia       4
4   2012-02-13         Mike        9

我想重塑它如下:

              Pete   Rob    Julia   Mike

2005-11-17     6     Nan     Nan    Nan
2014-02-04    Nan     3      Nan    Nan
2012-02-13    Nan     2      Nan    9
2004-12-16    Nan    Nan      4     Nan

我一直在尝试运行df.pivot(index='Date', columns='name', value='objects')但我收到'index has duplicate value'错误。

我认为pivotpivot_table在这些情况下起作用,因为索引和列之间基本上没有“冲突”(例如'Rob'和'2014-02-04'中的多个值数据框)。

我不想聚合 - 只是重塑。同样在示例中,日期不是有序的 - 但这并不重要。

我觉得这应该是一个简单的修复,但我看不到它。有人可以分享一些见解吗?

提前致谢。

2 个答案:

答案 0 :(得分:3)

您的实际数据似乎是重复的,请参阅示例:

print (df)
         Date   name  objects
0  2005-11-17   Pete        6
1  2014-02-04    Rob        3
2  2012-02-13    Rob        2
3  2004-12-16  Julia        4
4  2012-02-13   Mike        9 <-duplicates for 2012-02-13 and Mike
5  2012-02-13   Mike       18 <-duplicates for 2012-02-13 and Mike

解决方案为pivot_table,其中包含一些聚合函数,默认值为np.mean,但可以更改为sum,&#39; meadian&#39;,first,{{ 1}}。

last

使用df = df.pivot_table(index='Date', columns='name', values='objects', aggfunc=np.mean) print (df) name Julia Mike Pete Rob Date 2004-12-16 4.0 NaN NaN NaN 2005-11-17 NaN NaN 6.0 NaN 2012-02-13 NaN 13.5 NaN 2.0 <-13.5 is mean 2014-02-04 NaN NaN NaN 3.0 ,聚合函数和groupby的另一种解决方案:

unstack

为了检查重复,可以使用duplicatedboolean indexing

df = df.groupby(['Date','name'])['objects'].mean().unstack()
print (df)
name        Julia  Mike  Pete  Rob
Date                              
2004-12-16    4.0   NaN   NaN  NaN
2005-11-17    NaN   NaN   6.0  NaN
2012-02-13    NaN  13.5   NaN  2.0
2014-02-04    NaN   NaN   NaN  3.0

答案 1 :(得分:1)

您可以使用Column(autoincrement='auto')

df.pivot()

替代解决方案:

In [205]: x.pivot(index='Date', columns='name', values='objects')
Out[205]:
name        Julia  Mike  Pete  Rob
Date
2004-12-16    4.0   NaN   NaN  NaN
2005-11-17    NaN   NaN   6.0  NaN
2012-02-13    NaN   9.0   NaN  2.0
2014-02-04    NaN   NaN   NaN  3.0

实际上In [207]: x.groupby(['Date','name'])['objects'].first().unstack('name') Out[207]: name Julia Mike Pete Rob Date 2004-12-16 4.0 NaN NaN NaN 2005-11-17 NaN NaN 6.0 NaN 2012-02-13 NaN 9.0 NaN 2.0 2014-02-04 NaN NaN NaN 3.0 - 与提到的解决方案非常相似

使用Pandas版本0.19.2进行PS测试