Python 3.x 使用“应用”基于多个列值添加新列
我想在test_df中添加一个新列,它包含a列或b列的值,具体取决于change_col和change是否为True。下面的for循环可以工作,但速度太慢如何使用apply或类似工具添加新列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 = 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:),另外我喜欢编程explicityeq(True)
,因为初学者可能会感到困惑,因为如果将它与矢量化解决方案(如np)结合起来,就会理解这一点。select
@Adam.er8不同意重复,这不是简单的查找。见我在瓦伊沙利回答下的评论