我有以下名为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
我在做错什么,如何更改代码以获得所需的输出?
答案 0 :(得分:1)
一种选择是附加一个cumcount
版本:
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