【问题标题】:Select data from pandas multiindex pivottable从 pandas 多索引数据透视表中选择数据
【发布时间】:2017-05-24 22:53:50
【问题描述】:

我有一个包含 1703 行的多索引数据框(数据透视表),如下所示:

Local code     Ex Code    ...  Value      
159605         FR1xx      ...  30               
159973         FR1xx      ...  50    
...
ZZC923HDV906   XYxx       ...  20

有数字本地代码(例如 159973)或由字符和字符串组成的本地代码(例如 ZZC923HDV906) 我想按第一个索引列(本地代码)选择数据。这适用于具有以下代码的字符串字符

pv_comb[(pv_comb.index.get_level_values("Local code") == "ZZC923HDV906")] 

但是我无法选择数值:

pv_comb[(pv_comb.index.get_level_values("Local code") == 159973)]

这将返回一个空数据框。 是否可以将多索引第一列中的值转换为字符串字符,然后选择数据?

【问题讨论】:

    标签: pandas pivot-table multi-index


    【解决方案1】:

    IIUC 你需要'',因为你的numeric 值是strings - 所以159973 更改为'159973'

    pv_comb[(pv_comb.index.get_level_values("Local code") == '159973')]
    

    如果需要将某些级别的MultiIndex 转换为string 需要创建新索引然后分配:

    #if python 3 add list
    new_index = list(zip(df.index.get_level_values('Local code').astype(str),
                    df.index.get_level_values('Ex Code')))
    
    df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names)
    

    也可能有一些whitespaces,你可以通过strip删除它们:

    #change multiindex
    new_index = zip(df.index.get_level_values('Local code').astype(str).str.strip(),
                    df.index.get_level_values('Ex Code')
    df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names)
    

    如果许多级别是第一个reset_problematic级别的解决方案,请执行操作并设置索引。那么有可能sortlevel是必要的:

    df = pd.DataFrame({'Local code':[159605,159973,'ZZC923HDV906'],
                       'Ex Code':['FR1xx','FR1xx','XYxx'],
                       'Value':[30,50,20]})
    pv_comb = df.set_index(['Local code','Ex Code'])
    print (pv_comb)
                          Value
    Local code   Ex Code       
    159605       FR1xx       30
    159973       FR1xx       50
    ZZC923HDV906 XYxx        20
    
    pv_comb = pv_comb.reset_index('Local code')
    pv_comb['Local code'] = pv_comb['Local code'].astype(str)
    pv_comb = pv_comb.set_index('Local code', append=True).swaplevel(0,1)
    print (pv_comb)
                          Value
    Local code   Ex Code       
    159605       FR1xx       30
    159973       FR1xx       50
    ZZC923HDV906 XYxx        20
    

    【讨论】:

    • 感谢您的回答。我试过这个,但它不起作用。索引值似乎是对象而不是字符串
    • 我尝试通过 pv_comb.index.get_level_values('Local code') = pv_comb.index.get_level_values('Local code').astype(str) 将第一个索引列转换为字符串类型但这会返回“无法分配要调用的函数”我认为仅将第一个索引列转换为字符串可以解决我的问题。创建一个全新的索引会很复杂,因为数据透视表中有十多个索引级别跨度>
    • 嗯,如果是object,那显然是string。也许一些空格?
    • 您可以通过print (pv_comb.index.get_level_values("Local code").tolist())查看
    猜你喜欢
    • 2016-09-15
    • 2020-08-30
    • 2020-12-28
    • 1970-01-01
    • 2020-10-17
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多