python - 使用另一列在 Pandas 中创建新的格式化列
问题描述
我在熊猫数据框中有以下数据集:
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:])
我得到的错误是'object type'float' as no len()'。不确定这是从哪里来的,因为我在此列中没有任何浮点值。
解决方案
你快到了。您的 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 )
或者,由于您正在处理列/系列操作,您可以使用map
而不是apply
,它在列操作方面更快更有效。
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
推荐阅读
- python - AxisError:计算类的准确性时,轴 1 超出维度 1 数组的范围
- html - Overflow-x:hidden 不会阻止内容在移动浏览器上溢出
- docker - 无法使用 debezium 作为源和融合 jdbc 接收器连接器在目标数据库中删除更改
- excel - 根据日期更改单元格文本
- javascript - 使用 swr 时可以只获取一次数据吗?
- java - 如何检查 InputStream Base64 编码?(不转换为字节)
- sql - 如何优化结合了 JOIN 和 WHERE 子句的 SQL 查询?
- jooq - JOOQ & 交易
- java - 如何仅打印异常名称?
- java - com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造`java.time.LocalDate`的实例