使用嵌套字典映射一组列中的值

Mapping values in a set of columns using a nested dictionary

我的问题:在列集中,根据所选字典替换每列中的值。我有两个字典,每个字典都有一组键(列名),每个键都有两个不同的值。最后将这组列的值求和,保存到新的列中。

df = pd.DataFrame({'var1': [1,0,1,0,0,0,1], 'var2': [1,0,1,0,1,0,0], 'var3': [1,0,1,0,1,0,0]})

dict = { 
dict1 {"var1" : {0:0, 1:19}, "var2" : {0:0, 1:6}, "var3" : {0:0, 1:9}},
dict2 {"var1" : {0:0, 1:0}, "var2" : {0:0, 1:-1}, "var3" : {0:0, 1:-2}}
}

def get_values(df, dict):
        values = []
        for i in df.columns:
            np.where(df[i] == 1,
                     df[i].map(dict.key[dict]),
                     0)
            values = np.sum(df,axis=1).tolist()
        return values

dict1 = get_values(df, dict1)
dict2 = get_values(df, dict2)

我查找了涉及映射函数和嵌套字典的类似帖子,但找不到适合我查询的内容。

这里有一种方法可以满足您的要求:

import numpy as np
def replaceAndSumValues(df, d):
    out = df.transform(lambda x, dct: np.where(x, dct[x.name][1], dct[x.name][0]), dct=d)
    return out.assign(sum=out.sum(axis=1))

解释:

给定一个输入数据框和一个嵌套字典,对于每个列标签,将列值映射到替换值,函数 replaceAndSumValues() 将:

  • 使用transform()迭代数据框中的列并调用np.where()根据该列名称的嵌套字典替换每列中的值
  • 创建一个新列 sum,其中包含每行所有列中值的总和。

完整测试代码:

import pandas as pd
df = pd.DataFrame({'var1': [1,0,1,0,0,0,1], 'var2': [1,0,1,0,1,0,0], 'var3': [1,0,1,0,1,0,0]})
print(df)

dicts = { 
    'dict1': {"var1" : {0:0, 1:19}, "var2" : {0:0, 1:6}, "var3" : {0:0, 1:9}},
    'dict2': {"var1" : {0:0, 1:0}, "var2" : {0:0, 1:-1}, "var3" : {0:0, 1:-2}}
}
import numpy as np
def replaceAndSumValues(df, d):
    out = df.transform(lambda x, dct: np.where(x, dct[x.name][1], dct[x.name][0]), dct=d)
    return out.assign(sum=out.sum(axis=1))

df1 = replaceAndSumValues(df, dicts['dict1'])
print('df1:', df1, sep='\n')
df2 = replaceAndSumValues(df, dicts['dict2'])
print('df2:', df2, sep='\n')

输入:

   var1  var2  var3
0     1     1     1
1     0     0     0
2     1     1     1
3     0     0     0
4     0     1     1
5     0     0     0
6     1     0     0

输出:

df1:
   var1  var2  var3  sum
0    19     6     9   34
1     0     0     0    0
2    19     6     9   34
3     0     0     0    0
4     0     6     9   15
5     0     0     0    0
6    19     0     0   19
df2:
   var1  var2  var3  sum
0     0    -1    -2   -3
1     0     0     0    0
2     0    -1    -2   -3
3     0     0     0    0
4     0    -1    -2   -3
5     0     0     0    0
6     0     0     0    0