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

Pandas Dataframe Reshape/Pivot - Duplicate Values in Index Error

我正在使用 Python 2.7 和 Pandas 0.19.2

我看过一些与此问题类似的questions/answers,但仍然无法解决。

我有以下数据框:

          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 在这些情况下有效,因为索引和列之间基本上没有 'conflict'(例如 'Rob' 和 '2014 的多个值-02-04' 在数据框中)。

我不想聚合 - 只是重塑。同样在示例中,日期未按顺序排列 - 但这无关紧要。

我觉得这应该很容易解决,但我看不到。有人可以分享一些见解吗?

提前致谢。

看来你的真实数据是重复的,见样本:

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、'meadian'、firstlast.

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

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

检查是否重复可以使用duplicated with boolean indexing:

df = df[df.duplicated(subset=['Date','name'], keep=False)]
print (df)
         Date  name  objects
4  2012-02-13  Mike        9
5  2012-02-13  Mike       18

您可以使用 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

实际上 pivot_table() - 做的事情与提到的解决方案非常相似

PS 使用 Pandas 版本 0.19.2

测试