猿问

熊猫多索引切片无需排序

给定具有多索引列的数据帧


import pandas as pd

fish = [("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)

现在的问题是我不想对列进行排序,因为它们已经以反映所需输出的方式排序。有没有办法在不先排序的情况下设置多个列的值?


繁星coding
浏览 90回答 1
1回答

呼唤远方

它在上一个版本的熊猫中工作得很好。如果无法升级,可以升级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.1print (df)      Fish        Dog             Cat                 One  Two Three Four Five Three Four FiveBlue   NaN  NaN   NaN  3.1  3.1   NaN  NaN  NaNGreen  NaN  NaN   NaN  3.1  3.1   NaN  NaN  NaNRed    NaN  NaN   NaN  3.1  3.1   NaN  NaN  NaN
随时随地看视频慕课网APP

相关分类

Python
我要回答