使用嵌套字典映射一组列中的值
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
我的问题:在列集中,根据所选字典替换每列中的值。我有两个字典,每个字典都有一组键(列名),每个键都有两个不同的值。最后将这组列的值求和,保存到新的列中。
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