【问题标题】:Pandas: Modify a particular level of Multiindex, using replace method several timesPandas:修改特定级别的Multiindex,多次使用replace方法
【发布时间】:2019-04-11 18:46:03
【问题描述】:

我正在尝试多次使用 replace 方法来更改多索引熊猫数据框的给定级别的索引。

如此处所示:Pandas: Modify a particular level of Multiindex,@John 得到了一个效果很好的解决方案,只要使用一次 replace 方法即可。

问题是,如果我多次使用这种方法,它就不起作用。 例如

df.index = df.index.set_levels(df.index.levels[0].str.replace("dataframe_",'').replace("_r",' r'), level=0)

我收到以下错误消息:

AttributeError: 'Index' object has no attribute 'replace'

我错过了什么?

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    使用str.replace 两次:

    idx = df.index.levels[0].str.replace("dataframe_",'').str.replace("_r",' r')
    df.index = df.index.set_levels(idx, level=0)
    

    另一种解决方案是通过字典转换to_series,然后转换replace

    d = {'dataframe_':'','_r':' r'}
    idx = df.index.levels[0].to_series().replace(d)
    df.index = df.index.set_levels(idx, level=0)
    

    如果大数据和性能很重要,使用mapfillna 的解决方案:

    d = {'dataframe_':'','_r':' r'}
    s = df.index.levels[0].to_series()
    df.index = df.index.set_levels(s.map(d).fillna(s), level=0)
    

    示例

    df = pd.DataFrame({
            'A':['dataframe_','_r', 'a'],
            'B':[7,8,9],
            'C':[1,3,5],
    
    }).set_index(['A','B'])
    
    print (df)
                  C
    A          B   
    dataframe_ 7  1
    _r         8  3
    a          9  5
    
    d = {'dataframe_':'','_r':' r'}
    idx = df.index.levels[0].to_series().replace(d)
    df.index = df.index.set_levels(idx, level=0)
    print (df)
          C
    A  B   
       7  1
     r 8  3
    a  9  5
    

    【讨论】:

    • 非常感谢您的出色而广泛的回答!学到了非常有用的东西,请原谅我最初的愚蠢问题,因为我在第二个替换方法之前错过了“.str”。
    • @rubebop - 欢迎您!如果我的回答有帮助,请不要忘记 accept 它 - 单击答案旁边的复选标记,将其从灰色切换为已填充。谢谢。
    • 我接受了它:对不起,我对此很陌生,不知道这个功能。再次感谢! :)
    猜你喜欢
    • 2015-05-22
    • 2019-11-19
    • 1970-01-01
    • 2019-03-18
    • 2020-02-14
    • 2023-02-09
    • 2020-05-19
    • 2019-03-05
    • 2018-11-09
    相关资源
    最近更新 更多