Python-.apply()函数可将一行中的整行返回

时间:2019-08-07 20:27:00

标签: python pandas dataframe

首次发布;对于格式错误,我们深表歉意。我有一个数据集,该数据集在单独的列中包含年龄范围,并且我正在尝试根据AGE_OPERATOR_TXT列的字符串评估来创建一个新列:

我尝试过使用.apply()函数,lambda,具有iterrows()的循环等,但是我要么无法返回任何东西,要么该函数返回了所有行的序列:

def multum_age_ops(s):
    if s == "<":
        return data['AGE_LOW_NBR'] + " + " + data['AGE_UNIT_DISP']
else:
    return 0

data['age_op_test'] = data['AGE_OPERATOR_TXT'].apply(multum_age_ops)

我希望返回的列实际上看起来像:

age_ops_test
0 0
1 18 + years
2 1 + months
3 4 + months
4 4 + months

我得到的是:

age_ops_test
0                                                        0
1        0        18\n1        18\n2         1\n3      ...
2        0        18\n1        18\n2         1\n3      ...
3        0        18\n1        18\n2         1\n3      ...
4        0        18\n1        18\n2         1\n3      ...
5        0        18\n1        18\n2         1\n3      ...
6        0        18\n1        18\n2         1\n3      ...

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

ifly的注释中所述,关键是在apply上的整个数据帧上使用axis=1,以便将函数/ lambda应用于每一行。您的情况如下所示:

data['age_op_test'] = data.apply(lambda row: row['AGE_LOW_NBR'] + " + " + row['AGE_UNIT_DISP'] if row['AGE_OPERATOR_TXT'] == "<" else "0", axis=1)

答案 1 :(得分:1)

您还可以使用np.wheredoc):

data['age_op_test'] = np.where(data['AGE_OPERATOR_TXT'] == "<", data['AGE_LOW_NBR'] + " + " + data['AGE_UNIT_DISP'],0)

如果np.wheredata['AGE_OPERATOR_TXT'] == "<",则False在这种情况下将返回“ 0”。如果为True,则返回data['AGE_LOW_NBR'] + " + " + data['AGE_UNIT_DISP']

答案 2 :(得分:0)

您能尝试做这样的事情吗?


df.loc[df['AGE_OPERATOR_TXT']=='<', "age_op_test"] = df["AGE_LOW_NBR"].astype(str).str.cat(df["AGE_UNIT_DISP"].astype(str), sep=" + ")