python - 根据同一行其他列中的值将函数应用于数据框列元素?

标签 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['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() 的文档但我就是不知道如何将其付诸实践。

因为我需要访问 numbercondition 列中的值,所以我正在为从函数中引用其他列的语法而苦苦挣扎。

因此,我的预期输出是:

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' 并将同一行的这些列应用于函数 funcapply

这将返回以下结果:

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' 并将这些列应用于 funcAfuncBapply 在同一行。 funcAfuncB 将被应用的条件是通过 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/

相关文章:

匹配模式的 Python 模块

python - 如何删除 Pandas 中包含少于行数 1% 的非零列?

python - 在 python 中只加载图像的一部分

python - 在python中获取数组中数字的升序

python - 不可预测的泊松噪声

python - 使用 Python 访问 Facebook API 数据

python - session 总线初始化

python - 问题: dropna() method is returning NaN values

python-3.x - Pandas DataFrame 导出到_csv 更改列的 dtype

python - 提取 Nx3 数组的特定行,每列都满足条件