将多索引数据框的子集除以字典中的值

Posted

技术标签:

【中文标题】将多索引数据框的子集除以字典中的值【英文标题】:Divide subset of multiindex Dataframe by a value from dictionary 【发布时间】:2019-03-22 22:34:29 【问题描述】:

我有多索引 DataFrame 和字典。当字典键与 0 级索引对应时,我需要将 DF 中的所有数值除以字典中的数字。这是我的代码——我得到的只是 NaN 值。感谢帮助。

import pandas as pd

data = 
    "ix0" : ["a", "a", "b", "b"], 
    "ix1" : ["a", "b", "a", "b"], 
    "col1" : [0, 1, 2, 3],
    "col2" : [3, 2, 1, 0]


dict = 
    "a" : 10,
    "b" : 100 


df = pd.DataFrame(data).set_index(["ix0", "ix1"])

print(df, "\n")

for letter in dict.keys():
    df.loc[letter] = df.loc[letter].divide(dict[letter])

print(df)

输出:

         col1  col2
ix0 ix1            
a   a       0     3
    b       1     2
b   a       2     1
    b       3     0 

         col1  col2
ix0 ix1            
a   a     NaN   NaN
    b     NaN   NaN
b   a     NaN   NaN
    b     NaN   NaN

【问题讨论】:

【参考方案1】:

不要使用变量名dict,因为python代码字。

.items() 的字典循环并在MultiIndex 中选择使用slicers

d = 
    "a" : 10,
    "b" : 100 


idx = pd.IndexSlice

for k, v in d.items():
    df.loc[idx[k, :], :] /=  v
    #same like
    #df.loc[idx[k, :], :] =  df.loc[idx[k, :], :] / v

print(df)
         col1  col2
ix0 ix1            
a   a    0.00  0.30
    b    0.10  0.20
b   a    0.02  0.01
    b    0.03  0.00

【讨论】:

它有效,谢谢。顺便说一句,为什么我的 for 循环不起作用? 我认为问题在于df.loc[letter] 它不返回MultiIndex DataFrame

以上是关于将多索引数据框的子集除以字典中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个索引更新多索引数据框中的记录

将多索引数据帧的索引值提取为python中的简单列表

Pandas:根据条件为多索引数据帧的子集设置值的正确方法

多索引 df 中的线性回归

如何从嵌套字典创建多索引数据框?

如何将多索引列转换为熊猫数据框的单索引列?