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'
错误。
我认为 pivot
或 pivot_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'、first
、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
:
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
测试
我正在使用 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'
错误。
我认为 pivot
或 pivot_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'、first
、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
:
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
测试