如何在函数中格式化具有多个条件的If语句

时间:2019-06-29 22:04:59

标签: pandas if-statement conditional-statements

我正在创建一个函数,该函数将评估数据帧中的两个条件,并在遇到NaN的情况下将输入的一系列预定返回值传递给该数据帧。我要拥有的第一个条件是检查(看一眼)一列的值是否为NaN,然后​​检查另一列以查看已分配ID的键(1、2、3等) 。最终目标是在函数上使用.apply方法,以将函数返回原始数据帧的值填充到NaN值中,或单独保留现有值(如果存在)。让我挂断电话的是,这是我第一次编写类似这样的东西以在数据帧中调用,而我在控制流中遇到分配问题。

这是使用python 3.6。我尝试过下面的多种形式,但是在尝试将函数应用于数据框时,所有内容始终给我相同的类型错误。这不是实际的数据框架,但我很快就向您简要介绍了我所遇到的问题。

该函数显然有问题,但是理想情况下结果会将NaN值更新为40值

到目前为止,我已经尝试过以我认为有意义的所有方式对其进行修改,以使其能够遍历数据框。

import pandas as pd
import numpy as np

frame = {'key' : [1,2,3,4,5],
    'height' : [70, 68, 74, 67, 72],
    'age' : [29,45,'N/A',51,34]}

frame = pd.DataFrame(frame)

frame.replace('N/A',np.nan)

def age (x):
    if (x['age'].isnull()) & (x['key'] == 3):
        return x.replace(np.nan, 40)
    else: 
        return x

result = frame.apply(age) 

Here's a snapshot of the dataframe that I would like to amend

1 个答案:

答案 0 :(得分:0)

如果您真的想使用自定义功能并应用,可以按以下说明解决问题的方法。

import pandas as pd
import numpy as np
import math

frame = {'key' : [1,2,3,4,5],
    'height' : [70, 68, 74, 67, 72],
    'age' : [29,45,'N/A',51,34]}

frame = pd.DataFrame(frame)

frame = frame.replace('N/A',np.nan)

#function modified to compare the numpy float value with nan, math library is used here
def age(row):
    if (math.isnan(row['age'])) & (row['key'] == 3):
        return row.replace(np.nan, 40)
    else: 
        return row

result = frame.apply(age, axis=1) #here axis=1 is passing single row at a time to the function

输入数据框:

key height age
1   70     29.0
2   68     45.0
3   74     NaN
4   67     51.0
5   72     34.0

结果数据框:

key     height  age
1.0     70.0    29.0
2.0     68.0    45.0
3.0     74.0    40.0
4.0     67.0    51.0
5.0     72.0    34.0

希望对您有所帮助,您可以根据需要修改函数并修改列的数据类型。