【问题标题】:Pandas Multiindex dataframe remove rows熊猫多索引数据框删除行
【发布时间】:2018-01-02 04:32:28
【问题描述】:

我的 Multiiindex DF 如下:

tuples = list(zip(*[['a', 'a', 'b', 'b'], ['c', 'd', 'c', 'd']]))
index = pd.MultiIndex.from_tuples(tuples, names=['i1', 'i2'])
df = pd.DataFrame([5, 6, 7, 8], index=index[:4], columns=['col'])

       col
i1 i2     
a  c     5
   d     6
b  c     7
   d     8

希望保留索引(0 级)所在的行

idx_to_keep = ['a']

应该是一个简单的任务,但我想不出别的办法

idx_to_drop = np.setdiff1d(pd.unique(df.index.levels[0]), idx_to_keep)
df.drop(idx_to_drop, inplace = True)

       col
i1 i2     
a  c     5
   d     6

我可以做得更好吗?

【问题讨论】:

标签: python pandas multi-index


【解决方案1】:

你可以使用loc:

df.loc[['a']]

结果输出:

       col
i1 i2     
a  c     5
   d     6

【讨论】:

    【解决方案2】:

    您正在寻找.xs:

    df.xs('a', axis=0, level=0, drop_level=False)
    

    这给出了:

           col
    i1 i2     
    a  c     5
       d     6
    

    【讨论】:

    • 另外,如果要保留索引级别 0,可以指定 drop_level=False
    • 如果我想保留的不仅仅是 'a' 怎么办(例如,同时保留 'a' 和 'b')。
    【解决方案3】:

    一种方法是使用index方法get_level_values()

    df
           col
    i1 i2     
    a  c     5
       d     6
    b  c     7
       d     8
    
    df[df.index.get_level_values(0).isin(idx_to_keep)]
           col
    i1 i2     
    a  c     5
       d     6
    

    【讨论】:

    • 找到了一个更干净的解决方案,使用'level'参数:df = df[df.index.isin(idx_to_keep, level=0)]
    猜你喜欢
    • 2015-06-13
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多