如何根据行中其他列的条件从数据框中的列中减去

时间:2020-03-13 20:50:20

标签: python pandas dataframe

我像下面的示例一样设置了一个字典,并且如果行中的键与字典中的值匹配并且该行中的字符串列为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:字符串索引必须为整数”。我应该更改些什么来纠正它?

2 个答案:

答案 0 :(得分:2)

有用于此目的的pandas方法,请尝试避免不必要地使用会使代码变慢和变脏的循环。我们可以将Series.mapDataFrame.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)