首次发布;对于格式错误,我们深表歉意。我有一个数据集,该数据集在单独的列中包含年龄范围,并且我正在尝试根据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 ...
感谢您的帮助。
答案 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.where
(doc):
data['age_op_test'] = np.where(data['AGE_OPERATOR_TXT'] == "<", data['AGE_LOW_NBR'] + " + " + data['AGE_UNIT_DISP'],0)
如果np.where
为data['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=" + ")