使用另一列在Pandas中创建新的格式化列

2024-09-30 01:20:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我在熊猫数据框中有以下数据集:

I219
F03
C449
C189

我需要创建一个新列,其中如果单元格的长度为4,则在第三个字符后需要有一个句点,如下所示:

I21.9
F03
C44.9
C18.9

在深入研究StackOverflow之后,我想出了这个lambda表达式,但我似乎无法让它起作用

df['UNDERLYINGCAUSE_TEST'] = df.UNDERLYINGCAUSE.apply(lambda x: x if len(x) == 4 else x[0:3] + '.' + x[3:])

我得到的错误是“对象类型”float“as no len()”。不确定这是从哪里来的,因为我在这列中没有任何浮点值


Tags: 数据lambdatestdflen表达式字符stackoverflow
3条回答

看来,三元运算符的结果应该是相反的。要确保列类型为string,可以在应用lambda之前对其进行更改:

df['UNDERLYINGCAUSE_TEST'] = df['UNDERLYINGCAUSE_TEST'].astype(str)
df['UNDERLYINGCAUSE_TEST'] = df['UNDERLYINGCAUSE_TEST'].apply(lambda x: x[0:3] + '.' + x[3:] if len(x) == 4 else x)

你就快到了。您的lambda函数正在执行与您所希望的完全相反的操作,因为格式不正确。此外,还可以将列dtype转换为带有astype(str)的对象。试试这个:

df['UNDERLYINGCAUSE_TEST'] = df.UNDERLYINGCAUSE.astype(str).apply(lambda x: x[0:3] + '.' + x[3:] if len(x) == 4 else x )

或者,由于您正在处理列/系列操作,因此可以使用^{}而不是^{},这在列操作中更快、更有效

df['UNDERLYINGCAUSE_TEST'] = df.UNDERLYINGCAUSE.astype(str).map(lambda x: x[0:3] + '.' + x[3:] if len(x) == 4 else x )

输出

  UNDERLYINGCAUSE UNDERLYINGCAUSE_TEST
0            I219                I21.9
1             F03                  F03
2            C449                C44.9
3            C189                C18.9

我发现了我的错误。我需要在if语句的str()中放入x

df['UNDERLYINGCAUSE_TEST'] = df.UNDERLYINGCAUSE.apply(lambda x: x if len(str(x)) < 4 else x[0:3] + '.' + x[3:])

相关问题 更多 >

    热门问题