将函数的输出分配给与其他某些列中的条件匹配的行的数据框列

时间:2019-10-19 23:20:09

标签: 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'是我程序中其他位置派生的一些值。我们可以将它们作为常量进行讨论。

enter image description here

我当然可以使用“ for循环”并完成此操作,但是,我想知道是否存在使用pandas或numpy进行此操作的有效方法。我尝试使用'.where'方法,但是func()似乎将整个列'B'解释为其输入,而不是将列'B'的每个元素都作为(即...“ 2222”或“ 4444”)

def func(var1, var2, var3):
    <something>
    return(output)

import numpy as np
df['C'] = np.where(data['A'] == 'abc', func(data['B'], var2, var3), " ")

1 个答案:

答案 0 :(得分:0)

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.select

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