Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否基于同一行的其他列中的值将函数应用于dataframe列元素?_Python_Pandas_Numpy - Fatal编程技术网

Python 是否基于同一行的其他列中的值将函数应用于dataframe列元素?

Python 是否基于同一行的其他列中的值将函数应用于dataframe列元素?,python,pandas,numpy,Python,Pandas,Numpy,我有一个数据帧: 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 = 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))
但是,即使我将函数应用于数字列,我希望函数也引用
条件
列,即伪代码:

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
语句中?i、 e.参考条件列中的值,同时作用于数字列中的值

注意:我已经阅读了
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)}

我不知道如何使用
pandas.DataFrame.apply
,但是您可以定义一个特定的
条件:乘数
键值映射(见下面的
乘数
),并将其传递到您的函数中。然后,您可以使用列表理解来根据这些条件计算新的
编号
输出:

import pandas as pd
df = pd.DataFrame({'number': [10, 20 , 30, 40], 'condition': ['A', 'B', 'A', 'B']})

multiplier = {'A': 2, 'B': 4}

def func(num, condition, multiplier):
    return num * multiplier[condition]

df['new_number'] = [func(df.loc[idx, 'number'], df.loc[idx, 'condition'], 
                     multiplier) for idx in range(len(df))]
结果如下:

df
Out[24]: 
  condition  number  new_number
0         A      10          30
1         B      20          80
2         A      30          90
3         B      40         160

可能有一种更“理想”的矢量化纯pandas解决方案。但这在紧要关头也能起作用。

由于问题是关于将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”列,并使用
apply
将同一行的这些列应用于函数func

这将返回以下结果:

df
Out[10]: 
 condition  number  new_number
0   A   10  20
1   B   20  80
2   A   30  60
3   B   40  160
df
Out[12]:


    Conflict    Entries
0   Yes     manaaa
1   Yes     guyaaa
2   Yes     boyaaa
3   No  girlbbb
对于更新案例也可以使用
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”列,并将这些列应用于与
apply
相同行的funcA或funcB。将应用funcA或funcB的条件是通过lambda中的
if else
子句完成的

这将返回以下结果:

df
Out[10]: 
 condition  number  new_number
0   A   10  20
1   B   20  80
2   A   30  60
3   B   40  160
df
Out[12]:


    Conflict    Entries
0   Yes     manaaa
1   Yes     guyaaa
2   Yes     boyaaa
3   No  girlbbb

首先,创建df的代码有错误,其次需要
df.apply(lambda行:func(行['number'],行['condition']),axis=1)
这将
按行应用
以便您可以引用其他列。此外,当存在向量化方法时,不应求助于
apply
。您本可以完成
np.where(df['condition']='A',df['num']*3,df['num']*4)
但您的设置代码正在传递数字字符串column@EdChum道歉,检查错误。我同意-代码乱七八糟,我真的很惊讶它有一半的时间是有效的!好的,所以我可以写
df['number']=np.where(df[condition']='A',functionA,functionB)
并在其他地方定义
functionA
functionB
(比如在那行上方)?您需要精心设计这些函数来接受一个序列或数据帧,并返回一个布尔数组或一个与原始df长度相同的数组,但您已经定义了它,所以我不能推测它是否不存在code@EdChum
np.其中
解决方案很好,需要检查的条件很少,但在许多情况下都需要改进。@not_a_机器人我这里的观点是OP没有完全满足他们的要求,所以对我来说这是推测,我只能用这里提供的信息来回答