gpt4 book ai didi

python - 仅重新索引 MultiIndex 数据帧的级别,reindex() 损坏了吗?

转载 作者:行者123 更新时间:2023-12-03 16:37:54 25 4
gpt4 key购买 nike

我尝试仅在一个级别上使用两个或多个索引重新索引数据帧,但使用 .reindex()level争论,正如我在 this answer 中看到的那样似乎什么都不做,而不是预期的行为。

这是我尝试使用的代码:

import pandas as pd

dtest = pd.DataFrame([['Martin', 'room_1', 3],
['Martin', 'room_2', 2],
['Georges', 'room_2', 4],
['Georges', 'room_1', 12]],
columns=['name', 'room', 'time_spent'])
dtest.set_index(['name', 'room',], inplace=True)
display(dtest)
print(dtest.reindex(
['room_1', 'room_2', 'room_3'], level=1, fill_value=0))

哪个输出
                time_spent
name room
Martin room_1 3
room_2 2
Georges room_1 12
room_2 4

而我期待的输出是
                time_spent
name room
Martin room_1 3
room_2 2
room_3 0
Georges room_1 12
room_2 4
room_3 0
reindex()字面上什么也没做。

我是否错过了使用 reindex 的重要细节?还是东西坏了?

我正在使用 Python 3.6.7(v3.6.7:6ec5cf24b7,2018 年 10 月 20 日,03:02:14)的最新版本的 Pandas。

接受答案后编辑

我接受了@anky_91 的回答,他实际上提供了两种不同的解决方案。由于我的实际用例涉及多索引中的更多级别,让我用更多级别强调他的两个解决方案的行为。

起始数据帧现在由
import pandas as pd

dtest2 = pd.DataFrame([['2020-01-05', 'Martin', 'room_1', 3],
['2020-01-05', 'Martin', 'room_2', 2],
['2020-01-06', 'Georges', 'room_2', 4],
['2020-01-06', 'Georges', 'room_1', 12]],
columns=['date', 'name', 'room', 'time_spent'])
dtest2.set_index(['date', 'name', 'room',], inplace=True)
print(dtest2)

哪个输出
                           time_spent
date name room
2020-01-05 Martin room_1 3
room_2 2
2020-01-06 Georges room_2 4
room_1 12

适应这种情况的第一个解决方案是
mux = pd.MultiIndex.from_product((dtest2.index.get_level_values(0).unique(),
dtest2.index.get_level_values(1).unique(),
['room_1', 'room_2', 'room_3']
))
final_first_solution = dtest2.reindex(mux,fill_value=0)
print(final_first_solution)

哪个输出
                           time_spent
2020-01-05 Martin room_1 3
room_2 2
room_3 0
Georges room_1 0
room_2 0
room_3 0
2020-01-06 Martin room_1 0
room_2 0
room_3 0
Georges room_1 12
room_2 4
room_3 0

这不是我想要的输出,因为 Martin 只需要出现在 2020-01-05,而 Georges 只需要出现在 2020-01-06。换句话说,我只想扩大最后一层的索引 room .
但是,我设法调整了第二个解决方案以获得我想要的输出:
final_second_solution = dtest2.unstack((0, 1)).reindex(['room_1', 'room_2', 'room_3'], fill_value=0)\
.stack((-2, -1)).swaplevel(i=-1, j=0).swaplevel(i=1, j=0).sort_index()
print(final_second_solution)

正确地给我
                           time_spent
date name room
2020-01-05 Martin room_1 3.0
room_2 2.0
room_3 0.0
2020-01-06 Georges room_1 12.0
room_2 4.0
room_3 0.0

这就是为什么我接受了答案。谢谢!

为不同的用例编辑 2

经过更多测试,当您没有添加新房间,而是想要完成数据框中出现的所有房间时,上述解决方案失败。但解决方案更简单,如本例中 unstack已经创建了缺失的行,所以我们只需要使用 fillna而不是 reindex .以下代码
import pandas as pd

dtest3 = pd.DataFrame([['2020-01-05', 'Martin', 'room_1', 3],
['2020-01-06', 'Georges', 'room_2', 4]],
columns=['date', 'name', 'room', 'time_spent'])
dtest3.set_index(['date', 'name', 'room',], inplace=True)
print(dtest3)
final_third_solution = dtest3.unstack((0, 1)).fillna(0).stack((-2, -1)).reorder_levels([1,2,0]).sort_index()
print(final_third_solution)


因此给出了想要的结果
                           time_spent
date name room
2020-01-05 Martin room_1 3.0
room_2 0.0
2020-01-06 Georges room_1 0.0
room_2 4.0

(我还在评论中包含了使用 reorder_levels 而不是使用多个 swaplevel 的建议)。

使用 .fillna(0).reindex(..., fill_value=0)应该包含您想要完成和添加新元素的两种情况。

最佳答案

您需要使用 pd.MultiIndex.from_product() 为此创建一个多索引。和 get_level_values :

mux=(pd.MultiIndex.from_product((dtest.index.get_level_values(0).unique()
,['room_1', 'room_2', 'room_3'])))
final=dtest.reindex(mux,fill_value=0)
                time_spent
Martin room_1 3
room_2 2
room_3 0
Georges room_1 12
room_2 4
room_3 0

如果你只想用现有的索引添加另一个索引,使用 Index.union from_product()参数:
mux=(pd.MultiIndex.from_product((dtest.index.get_level_values(0).unique()
,dtest.index.get_level_values(1).unique().union(['room3'],sort=False))))
final=dtest.reindex(mux,fill_value=0)

time_spent
Martin room_1 3
room_2 2
room_3 0
Georges room_1 12
room_2 4
room_3 0

添加另一个方法 stack() unstack() swaplevel :
final=dtest.unstack(0).reindex(['room_1', 'room_2', 'room_3']
,fill_value=0).stack().swaplevel().sort_index()
                time_spent
name room
Georges room_1 12
room_2 4
room_3 0
Martin room_1 3
room_2 2
room_3 0

关于python - 仅重新索引 MultiIndex 数据帧的级别,reindex() 损坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59471286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com