熊猫:如果条件在循环中更新值

时间:2018-11-01 23:27:25

标签: pandas for-loop conditional-statements

如果满足条件,我必须更新数据框列。但是有多个条件和多个值可以更新。因此,我想循环执行。

数据框如下:

mode  car1  car2  bus1  bus2
car1   10    20    5     2
car2   11    22    3     1
bus1   4     4     2     2  
bus2   3     4     3     5

我意识到数据结构有点奇怪,但是让我们开始吧。如果mode表示car1,则我希望新列值在car1列中具有该值。依此类推。

我的代码如下:

targets = ['car1', 'car2', 'bus1', 'bus2']
for target in targets:
    df.loc[(df.mode==f'target'),'value']=df.[target]

这有效,但是每一个用NaN替换不满足条件的行。因此,我最后只会看到新的value列,其中包含bus2行中bus2的值,而所有其他行中都包含NaN。

在Stata中,我会写:

gen value = .
foreach x in car1 car2 bus1 bus2 {
replace value = `x' if mode=="`x'"
}

正在寻找Python中类似的代码!

2 个答案:

答案 0 :(得分:1)

pandas中有lookup

df['newvalue']=df.set_index('mode').lookup(df['mode'],df['mode'])
df
Out[184]: 
   mode  car1  car2  bus1  bus2  newcol  newvalue
0  car1    10    20     5     2      10        10
1  car2    11    22     3     1      22        22
2  bus1     4     4     2     2       2         2
3  bus2     3     4     3     5       5         5

答案 1 :(得分:0)

这应该有效:

df['newcol'] = 0
for key, item in df.iterrows():
    df['newcol'].iloc[key] = item[item['mode']]
相关问题