Pandas 错误:索引包含重复条目,无法重塑

Gui*_*nha 3 python pandas

我的问题似乎重复,因为我发现不同的问题具有相同的错误,如下所示:

Pandas:根据值对列进行分组并创建新的列标题

Python/Pandas - ValueError:索引包含重复条目,无法重塑

Pandas 数据透视产生“ValueError:索引包含重复条目,无法重塑

我尝试了这些帖子中提出的所有解决方案,但没有一个有效。我相信该错误可能是由我的数据集格式引起的,该格式具有字符串而不是数字,并且可能存在重复的整体。以下是我的数据集的示例:

协议号 活动 描述
1586212 一天两次
1586212 驾驶 5公里
1586212 驾驶 至少30分钟
1586212 睡觉
1586212 1500卡路里
2547852
2547852 驾驶
2547852 3200卡路里
2547852 避免面食
2547852 睡觉 至少10小时

我想要实现的输出是:

协议号 驾驶 睡觉
1586212 一天两次 5公里 1500卡路里
2547852 3200卡路里 至少10小时

我尝试使用pivot和pivot_table,代码如下:

df.pivot(index="protocol_no", columns="activity", values="description")
Run Code Online (Sandbox Code Playgroud)

但我仍然收到此错误:

ValueError: Index contains duplicate entries, cannot reshape
Run Code Online (Sandbox Code Playgroud)

不知道出了什么问题,所以任何帮助都会有帮助!

编辑:

我注意到我的数据包含错误以及 @DYZ 和 @SeaBean 用户所述的重复整体。因此,我编辑了数据库示例,并为我的数据集提供了正确的答案。希望它能帮助某人。

Sea*_*ean 7

如果在使用时遇到重复索引错误,请尝试使用.piviot_table()with (或类似的东西)aggfunc='first'.pivot()

df.pivot_table(index="protocol_no", columns="activity", values="description", aggfunc='first')
Run Code Online (Sandbox Code Playgroud)

当您设置的列index具有重复值时,这是一种常见情况。使用aggfunc='first' (或有时aggfunc='sum'取决于条件)很可能可以解决问题。

结果:

activity    drive            eat              sleep         walk
protocol_no                                                     
1586212      5 km  1500 calories                NaN  twice a day
2547852       NaN  3200 calories  At least 10 hours          NaN
Run Code Online (Sandbox Code Playgroud)

编辑

根据您最新编辑的重复条目,您可以通过更改上面的函数来修改上面的解决方案aggfunc,如下所示:

df.pivot_table(index="protocol_no", columns="activity", values="description", aggfunc=lambda x: ' '.join(x.dropna()))
Run Code Online (Sandbox Code Playgroud)

在这里,我们将aggfuncfrom更改'first'lambda x: ' '.join(x.dropna())。它无需添加多行代码即可实现与所需输出相同的结果。

结果:

activity                    drive                        eat              sleep         walk
protocol_no                                                                                 
1586212      5 km At least 30 min              1500 calories                     twice a day
2547852                            3200 calories Avoid pasta  At least 10 hours             
Run Code Online (Sandbox Code Playgroud)

  • @GuilhermeNoronha 是的,这是预料之中的。大多数时候“first”在这种情况下效果很好。这里作为聚合函数的“first”与“GroupBy.first”有些相同(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.GroupBy.first。 html) 函数,有时我们也将 `pivot_table` 与 `groupby()` 函数互换使用。这里,“first”是在组中存在多个(重复)值的情况下获取组中的第一个。 (2认同)