我正在使用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'
错误。
我认为pivot
或pivot_table
在这些情况下起作用,因为索引和列之间基本上没有“冲突”(例如'Rob'和'2014-02-04'中的多个值数据框)。
我不想聚合 - 只是重塑。同样在示例中,日期不是有序的 - 但这并不重要。
我觉得这应该是一个简单的修复,但我看不到它。有人可以分享一些见解吗?
提前致谢。
答案 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
为了检查重复,可以使用duplicated
与boolean 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测试