我有一个 Polars DataFrame,其中包含一列,其中的字符串表示“稀疏”部门风险敞口,如下所示:
pl.DataFrame(
[
pl.Series("sector_exposure", [
'Technology=0.207;Financials=0.090;Health Care=0.084;Consumer Discretionary=0.069',
'Financials=0.250;Health Care=0.200;Consumer Staples=0.150;Industrials=0.400'
], dtype=pl.String),
]
)
扇区曝光 |
---|
科技=0.207;金融=0.090;医疗保健=0.084;非必需消费品=0.069 |
金融=0.250;医疗保健=0.200;消费品=0.150;工业=0.400 |
我想将此字符串“解压”到每个部门(例如,技术、金融、医疗保健)的新列中,并具有相关值或以部门名称作为字段和曝光值的极坐标结构。
我正在寻找一种仅使用极坐标表达式的更有效的解决方案,而不求助于 Python 循环(或 python 映射函数)。任何人都可以提供如何实现这一目标的指导吗?
这是我到目前为止所想出的——它可以生成所需的结构,但有点慢。
(
df["sector_exposure"]
.str
.split(";")
.map_elements(lambda x: {entry.split('=')[0]: float(entry.split('=')[1]) for entry in x},
skip_nulls=True,
)
)
谢谢!
我能想到的可能有两种方法。
正则表达式提取
在这个例子中,我们依赖于所有的数字都是十进制的(您可以调整正则表达式来解决这个问题)以及在生成器中预先指定的所有扇区
with_columns
拆分和旋转
在这个中,您在分号处进行“一轮”分裂,然后爆炸。然后,您再次对等分割,但将其转换为一个结构,然后取消嵌套。从那里您可以将扇区向上旋转到列。
如果扇区以相同的顺序存在,那么您可以使用,
str.extract_groups
但如果顺序不同,我认为它不起作用。正如另一条评论中提到的,您可以执行几次替换以将这些值视为
json
. 如果您没有提前列出所有可能的字段,这将有所帮助: