我有一个数据框:
df = pd.DataFrame(
{'number': ['10', '20' , '30', '40'], 'condition': ['A', 'B', 'A', 'B']})
df =
number condition
0 10 A
1 20 B
2 30 A
3 40 B
我想对数字列中的每个元素应用一个函数,如下所示:
df['number'] = df['number'].apply(lambda x: func(x))
但是,即使我将函数应用于数字列,我也希望函数也引用 condition
列,即在伪代码中:
func(n):
#if the value in corresponding condition column is equal to some set of values:
# do some stuff to n using the value in condition
# return new value for n
对于一个数字,我会写一个示例函数:
number = 10
condition = A
def func(num, condition):
if condition == A:
return num*3
if condition == B:
return num*4
func(number,condition) = 15
如何将相同的功能合并到上面编写的 apply
语句中?即引用条件列中的值,同时作用于数字列中的值?
注意:我已经通读了关于np.where()
、pandas.loc()
和pandas.index()
的文档但我就是不知道如何将其付诸实践。
因为我需要访问 number
和 condition
列中的值,所以我正在为从函数中引用其他列的语法而苦苦挣扎。
因此,我的预期输出是:
df =
number condition
0 30 A
1 80 B
2 90 A
3 160 B
更新:以上内容过于模糊。请看以下内容:
df1 = pd.DataFrame({'Entries':['man','guy','boy','girl'],'Conflict':['Yes','Yes','Yes','No']})
Entries Conflict
0 "man" "Yes"
1 "guy" "Yes"
2 "boy" "Yes"
3 "girl" "No
def funcA(d):
d = d + 'aaa'
return d
def funcB(d):
d = d + 'bbb'
return d
df1['Entries'] = np.where(df1['Conflict'] == 'Yes', funcA, funcB)
Output:
{'Conflict': ['Yes', 'Yes', 'Yes', 'Np'],
'Entries': array(<function funcB at 0x7f4acbc5a500>, dtype=object)}
我如何应用上面的 np.where 语句来获取评论中提到的 pandas 系列,并产生如下所示的所需输出:
期望的输出:
Entries Conflict
0 "manaaa" "Yes"
1 "guyaaa" "Yes"
2 "boyaaa" "Yes"
3 "girlbbb" "No
最佳答案
由于问题是关于对同一行的数据框列的 apply 函数,将 pandas apply
函数与 lambda
结合使用似乎更准确:
import pandas as pd
df = pd.DataFrame({'number': [10, 20 , 30, 40], 'condition': ['A', 'B', 'A', 'B']})
def func(number,condition):
multiplier = {'A': 2, 'B': 4}
return number * multiplier[condition]
df['new_number'] = df.apply(lambda x: func(x['number'], x['condition']), axis=1)
在此示例中,lambda
获取数据帧 df 的列 'number' 和 'condition' 并将同一行的这些列应用于函数 func 与 apply
。
这将返回以下结果:
df
Out[10]:
condition number new_number
0 A 10 20
1 B 20 80
2 A 30 60
3 B 40 160
对于UPDATE 情况,也可以使用 pandas apply
函数:
df1 = pd.DataFrame({'Entries':['man','guy','boy','girl'],'Conflict':['Yes','Yes','Yes','No']})
def funcA(d):
d = d + 'aaa'
return d
def funcB(d):
d = d + 'bbb'
return d
df1['Entries'] = df1.apply(lambda x: funcA(x['Entries']) if x['Conflict'] == 'Yes' else funcB(x['Entries']), axis=1)
在此示例中,lambda
获取数据帧 df 的列 'Entries' 和 'Conflict' 并将这些列应用于 funcA或 funcB 与 apply
在同一行。 funcA 或 funcB 将被应用的条件是通过 lambda 中的 if-else
子句完成的。
这将返回以下结果:
df
Out[12]:
Conflict Entries
0 Yes manaaa
1 Yes guyaaa
2 Yes boyaaa
3 No girlbbb
关于python - 根据同一行其他列中的值将函数应用于数据框列元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41962022/