python - 为什么我的多索引数据框具有重复的索引值?
问题描述
我有以下名为 df 的 pd.DataFrame:
date cluster_label value
0 2018-11-14 02:16:22 0 1.5
1 2018-11-14 02:16:22 0 7.0
2 2018-11-14 02:16:22 0 2.5
3 2018-11-14 02:16:22 1 3.0
4 2018-11-14 02:16:22 1 0.5
5 2018-11-14 02:16:22 2 1.0
在设置多级索引或数据框之前,我执行以下命令将日期列转换为只有月份和年份值:
self.df['date'] = self.df['date'].dt.to_period('M')
self.df.set_index(['cluster_label', 'date'], inplace=True)
现在,输出是这样的:
value
cluster_label date
0 2018-11 1.5
2018-11 7.0
2018-11 2.5
1 2018-11 3.0
2018-11 0.5
2 2018-11 1.0
但这是错误的。我希望输出没有日期列的重复索引。输出应如下所示:
value
cluster_label date
0 2018-11 1.5
7.0
2.5
1 2018-11 3.0
0.5
2 2018-11 1.0
我做错了什么,如何更改我的代码以获得所需的输出?
解决方案
一种选择是附加一个cumcount
ed 级别:
df.set_index(df.groupby(level=[0,1]).cumcount(), append=True)
value
cluster_label date
0 2018-11 0 1.5
1 7.0
2 2.5
1 2018-11 0 3.0
1 0.5
2 2018-11 0 1.0
在哪里,
df.set_index(df.groupby(level=[0,1]).cumcount(), append=True).index
# MultiIndex(levels=[[0, 1, 2], [2018-11], [0, 1, 2]],
# labels=[[0, 0, 0, 1, 1, 2], [0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 0]],
# names=['cluster_label', 'date', None])
另一种选择(我不推荐)是显式屏蔽这些值并重置索引。
u = np.where(df.index.duplicated(), '', df.index.get_level_values(1))
df.index = pd.MultiIndex.from_arrays([df.index.get_level_values(0), u])
df
value
cluster_label
0 2018-11 1.5
7.0
2.5
1 2018-11 3.0
0.5
2 2018-11 1.0
推荐阅读
- rpm - rpm -qa 显示已安装软件包,但 rpm -e 显示未安装
- android - 使用 Android BLE Gatt 时如何接收重新连接通知
- linux - 无需桌面管理器即可显示的 Linux 绘图
- firebase - 在 Firebase 控制台中查看数据库
- javascript - 如何在 SVG 动画上获得最佳性能(鼠标悬停时 FPS 下降)
- java - 使用 websocket 获取数据流时的主要问题是什么?
- amazon-web-services - 通过 CLI 阻止所有对象在 S3 中的公共访问
- android - 如何解决 Flutter Activity 中 BOTTOM OVERFLOWED BY 84 PIXLES 的问题?
- python - GET请求后的Django DRF PUT请求ImageField
- matlab - 如何在 Matlab 中将 3D 路径数据绘制为条带