Python 为与其他列中的条件匹配的行将函数的输出分配给dataframe列

Python 为与其他列中的条件匹配的行将函数的输出分配给dataframe列,python,pandas,numpy,dataframe,conditional-statements,Python,Pandas,Numpy,Dataframe,Conditional Statements,如图所示,我有一个数据框'df',其中列'a','B'。我想创建一个新列'C',并将其分配给函数func()的输出。但是,限制条件是,只有那些行(在“C”中)被分配了列“A”条目与“abc”匹配的值。对于这些行,func()的输入变量将是'B'列的相应条目 例如,在所附照片中,第0行和第2行的列'A'值为'abc'。对于此类行,'C'中的值应通过func()使用列'B'中的值来计算(在这种情况下,“2222”或“4444”) 注意:变量'var2','var3'是在我的程序中其他地方派生的一些值

如图所示,我有一个数据框'df',其中列'a''B'。我想创建一个新列'C',并将其分配给函数func()的输出。但是,限制条件是,只有那些行(在“C”中)被分配了列“A”条目与“abc”匹配的值。对于这些行,func()的输入变量将是'B'列的相应条目

例如,在所附照片中,第0行和第2行的列'A'值为'abc'。对于此类行,'C'中的值应通过func()使用列'B'中的值来计算(在这种情况下,“2222”“4444”

注意:变量'var2''var3'是在我的程序中其他地方派生的一些值。在这里,我们可以把它们当作常量来讨论

当然,我可以使用“for循环”来实现这一点,但是,我想知道是否有任何有效的方法可以使用pandas或numpy来实现这一点。我尝试使用“.where”方法,但func()似乎将整个列“B”解释为它的输入,而不是接受列“B”的每个元素(即“2222”或“4444”)

def func(var1、var2、var3):
返回(输出)
将numpy作为np导入
df['C']=np.where(数据['A']='abc',func(数据['B'],var2,var3),“”)

IIUC,您可以使用
.loc
方法访问数据框中的每个项目,并使用
.apply()
将分配应用到其中:

不确定您有多少个条件,但模仿上面的代码:

df.loc[df['A'] == 'abc', 'C'] = df['B'].apply(func)
比如说,

import pandas as pd
a = ['abc','b','abc']
b = [1,2,3]
df = pd.DataFrame({'A' : a,
              'B' : b})
print(df)
   A  B
0  abc  1
1    b  2
2  abc  3
df.loc[df['A'] == 'abc','C'] = df['B'].apply(lambda x : x ** 2)
   A    B    C
0  abc  1  1.0
1    b  2  NaN
2  abc  3  9.0
如果您的逻辑更复杂,您可以使用
np。选择
,如下所示:

conditions  = [ df['B'] >= 3, (df['B'] < 3) & (df['B']> 1), df['B'] <= 1]
choices     = [ "high", 'medium', 'low' ]

df["C"] = np.select(conditions, choices, default=np.nan)

print(df)
     A  B       C
0  abc  1     low
1    b  2  medium
2  abc  3    high

conditions=[df['B']>=3,(df['B']<3)和(df['B']>1),df['B']Hi@datanoveler,感谢您的响应。在我的例子中,func()接受多个输入,与func(var1,var2)类似,其中var1是“B”列的值,而var2是常量。我想知道您的代码需要如何修改“.apply”(func)'以便将var1和var2反映为func()的输入。您能告诉我在这种情况下您的代码是如何修改的吗?我对这么多实现这一点的技巧感到惊讶,感谢您的编辑!您的建议通常是有效的,但是,在我的情况下,函数'func(var1,var2)'会在其他地方查询数据库以根据其输出进行派生(返回的值)。然后应将返回的值放在“C”列中。我想知道您是否有任何建议来完成此操作?顺便说一句,我也编辑了我的原始问题描述以使其更清楚。@Sinha您是否能够显示数据示例和预期输出?
conditions  = [ df['B'] >= 3, (df['B'] < 3) & (df['B']> 1), df['B'] <= 1]
choices     = [ "high", 'medium', 'low' ]

df["C"] = np.select(conditions, choices, default=np.nan)

print(df)
     A  B       C
0  abc  1     low
1    b  2  medium
2  abc  3    high