Python 3.x 使用“应用”基于多个列值添加新列

Python 3.x 使用“应用”基于多个列值添加新列,python-3.x,pandas,Python 3.x,Pandas,我想在test_df中添加一个新列,它包含a列或b列的值,具体取决于change_col和change是否为True。下面的for循环可以工作,但速度太慢如何使用apply或类似工具添加新列 test_df = pd.DataFrame({"a":[1,1,2,3], "b":["ant","ber","cas","dor"], "change_col":["a","b","b","a"],

我想在test_df中添加一个新列,它包含a列或b列的值,具体取决于change_col和change是否为True。下面的for循环可以工作,但速度太慢如何使用apply或类似工具添加新列

test_df = pd.DataFrame({"a":[1,1,2,3],
                    "b":["ant","ber","cas","dor"],
                    "change_col":["a","b","b","a"],
                    "change":[True,True,True,False]})

    a   b      change_col   change
0   1   ant        a       True
1   1   ber        b       True
2   2   cas        b       True
3   3   dor        a       False
所需的df:

    a   b     change_col    change  new_value
0   1   ant        a        True    1
1   1   ber        b        True    ber
2   2   cas        b        True    cas
3   3   dor        a        False   NaN
我的for循环

new_value= []
for _ , row in test_df.iterrows():
    if row["change"] is True:
        new_value +=[row[row["change_column"]]]
    else:
        new_value += [np.NaN]
test_df["new_value"] = new_value

我正在python 3.7上使用pandas 0.24.2。

您可以使用[DataFrame.lookup][1]

test_df['new_val'] = test_df.lookup(test_df.index, test_df['change_col'])

    a   b   change_col  change  new_val
0   1   ant a           True    1
1   1   ber b           True    ber
2   2   cas b           True    cas
3   3   dor a           False   3
编辑:要说明更改列,请使用条件

test_df['new_val'] = np.where(test_df['change'], test_df.lookup(test_df.index, test_df['change_col']), np.nan)

    a   b   change_col  change  new_val
0   1   ant a           True    1
1   1   ber b           True    ber
2   2   cas b           True    cas
3   3   dor a           False   NaN
下面是一个使用以下方法的解决方案:

将熊猫作为pd导入
将numpy作为np导入
test_df=pd.DataFrame({“a”:[1,1,2,3],
“b”:[“ant”、“ber”、“cas”、“dor”],
“变更内容”:[“a”、“b”、“b”、“a”],
“更改”:[True,True,True,False]})
变更a=((测试df['change'])和(测试df['change\col']='a'))
变更=((test_df['change'])和(test_df['change_col']='b'))
不改变=~test\u df['change']
条件=[改变a,改变b,不改变]
选项=[test_df['a'],test_df['b'],np.nan]
测试_df[“新值”]=np.选择(条件、选项)
打印(测试测向)
输出:

   a    b  change change_col new_value
0  1  ant    True          a         1
1  1  ber    True          b       ber
2  2  cas    True          b       cas
3  3  dor   False          a       NaN

由于您有多个条件,我们可以使用
np。在此处选择
来定义我们的条件,并根据这些条件选择我们的值:

conditions = [
    test_df['change_col'].eq('a') & test_df['change'].eq(True),
    test_df['change_col'].eq('b') & test_df['change'].eq(True)
]

test_df['new_value'] = np.select(conditions, choicelist=[test_df['a'], test_df['b']], default=np.NaN)
输出

   a    b change_col  change new_value
0  1  ant          a    True         1
1  1  ber          b    True       ber
2  2  cas          b    True       cas
3  3  dor          a   False       NaN

就像这一个,你只是错过了一个条件,这应该是有效的:
np.where(test_df['change'],test_df.lookup(test_df.index,test_df['change\u col']),np.NaN
@Erfan,是的,我没有看到改变的条件,谢谢,它适用于多个列!select有默认值,nice:DYes:),另外我喜欢编程explicity
eq(True)
,因为初学者可能会感到困惑,因为如果将它与矢量化解决方案(如
np)结合起来,就会理解这一点。select
@Adam.er8不同意重复,这不是简单的查找。见我在瓦伊沙利回答下的评论