我像下面的示例一样设置了一个字典,并且如果行中的键与字典中的值匹配并且该行中的字符串列为yes,则尝试从DataFrame的列中减去值。>
dic = {1:2300,
2:3000,
56:572
37:2930}
df = key string value
1 yes 5000
4 yes 2000
56 no 1000
56 yes 6000
14 yes 3000
仅当键存在于字典中并且字符串==是时,我才希望函数从值列中减去字典值。结果数据框如下所示:
after = key string value
1 yes 2700
4 yes 2000
56 no 1000
56 yes 5428
14 yes 3000
我尝试编写一个循环,遍历数据帧的每一行,如果键和字符串值匹配,则用dic [row]减去df ['value'],但是在尝试调整多个内容后它不起作用。
for row in df:
if dic.get(row['key'],0)!=0 and row['string']=='yes':
row['value']=row['value']-dic[row['key']]
此代码无效,仅返回“ TypeError:字符串索引必须为整数”。我应该更改些什么来纠正它?
答案 0 :(得分:2)
有用于此目的的pandas方法,请尝试避免不必要地使用会使代码变慢和变脏的循环。我们可以将Series.map
与DataFrame.loc
结合使用:
df.loc[df['string'].eq('yes'),'value']=(df['value'].sub(df['key'].map(dic))
.fillna(df['value']))
key string value
0 1 yes 2700.0
1 4 yes 2000.0
2 56 no 1000.0
3 56 yes 5428.0
4 14 yes 3000.0
答案 1 :(得分:0)
#sample dataframe
d = {'key': [1,4,56,56,14], 'string': ['yes','yes','no','yes','yes'], 'value': [5000, 2000, 1000, 6000,3000]}
df = pd.DataFrame(data=d)
#dictionary
dic = {1:2300,
2:3000,
56:572,
37:2930}
#iterating through dataframe
for i, row in df.iterrows():
#assigning values
key = df.loc[i,'key']
string = df.loc[i,'string']
value = df.loc[i,'value']
#if key in dictionary and string == yes, get value from dictionary by key and calculate the result
if key in dic.keys() and string == 'yes':
dicValue = dic[key]
result = value - dicValue
print(result)