我有一个数据框'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):
<something>
return(output)
import numpy as np
df['C'] = np.where(data['A'] == 'abc', func(data['B'], var2, var3), " ")
答案 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