给定具有多索引列的数据帧import pandas as pdfish = [("Fish", lli) for lli in ["One", "Two"]]dogs = [("Dog", lli) for lli in ["Three", "Four", "Five"]]cats = [("Cat", lli) for lli in ["Three", "Four", "Five"]]df = pd.DataFrame(index=["Blue", "Green", "Red"], columns=pd.MultiIndex.from_tuples(fish+dogs+cats))-df = Fish Dog Cat One Two Three Four Five Three Four Five Blue NaN NaN NaN NaN NaN NaN NaN NaN Green NaN NaN NaN NaN NaN NaN NaN NaN Red NaN NaN NaN NaN NaN NaN NaN NaN现在我想同时设置两列的值,例如df.loc[:, ('Dog', ['Four', 'Five'])] = 3.1这导致了一个KeyError说KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)'该问题可以通过在设置值之前对列进行排序来“解决”df = df.sort_index(axis=1)现在的问题是我不想对列进行排序,因为它们已经以反映所需输出的方式排序。有没有办法在不先排序的情况下设置多个列的值?
1 回答
呼唤远方
TA贡献1856条经验 获得超11个赞
它在上一个版本的熊猫中工作得很好。
如果无法升级,可以升级pandas,可以通过Index.get_level_values
和Index.isin
创建的掩码选择级别,并设置如下值:
m1 = df.columns.get_level_values(0) == 'Dog'
m2 = df.columns.get_level_values(1).isin(['Four','Five'])
df.loc[:, m1 & m2] = 3.1
print (df)
Fish Dog Cat
One Two Three Four Five Three Four Five
Blue NaN NaN NaN 3.1 3.1 NaN NaN NaN
Green NaN NaN NaN 3.1 3.1 NaN NaN NaN
Red NaN NaN NaN 3.1 3.1 NaN NaN NaN
添加回答
举报
0/150
提交
取消