【问题标题】:Pandas MultiIndex slicing without sortingPandas MultiIndex 切片不排序
【发布时间】:2020-06-29 09:52:42
【问题描述】:

给定一个具有多索引列的 DataFrame

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)

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

【问题讨论】:

  • 你的熊猫版本是什么?
  • 这似乎在版本'1.0.0'中工作
  • 对我来说工作得很好,我认为有必要升级 pandas
  • 我在 0.19.1,无法升级。

标签: python pandas dataframe sorting multi-index


【解决方案1】:

它在最新版本的 pandas 中运行良好。

如果不可能升级 pandas,则可以通过 Index.get_level_valuesIndex.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

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 2018-12-29
    • 2020-09-10
    • 2017-05-08
    • 1970-01-01
    • 2021-01-03
    • 2016-01-07
    • 2016-04-08
    • 2014-05-28
    相关资源
    最近更新 更多