如何在熔化极坐标数据框的过程中删除空值?

问题描述 投票:0回答:1

我有一个大的极坐标数据框,我需要

melt
,并且该数据框包含很多空值(至少一半)。我想在熔化数据帧的其余部分的同时删除空值。我之前尝试过先对数据帧进行
melt
处理,然后使用
drop_nulls()
或类似的方法对其进行过滤,但这太占用内存了(在具有大约 1TB RAM 的机器上)。有没有一种方法可以在融化过程中过滤数据集?如有任何帮助,我们将不胜感激!

样本数据:

df = {
    "A": [null, 2, 3],
    "B": [null, null, 2],
    "C": [null, null, null], 
    "names": ["A", "B", "C"]
}
df = pl.DataFrame(df)
#this dataset has about 160k rows and columns (square matrix), and is about 100GB

df = df.melt(id_vars = "names", variable_name = "names_2", value_name = "distance")
#output: 
df

shape: (9, 3)
┌───────┬─────────┬──────────┐
│ names ┆ names_2 ┆ distance │
│ ---   ┆ ---     ┆ ---      │
│ str   ┆ str     ┆ i64      │
╞═══════╪═════════╪══════════╡
│ A     ┆ A       ┆ null     │
│ B     ┆ A       ┆ null     │
│ C     ┆ A       ┆ null     │
│ A     ┆ B       ┆ 2        │
│ B     ┆ B       ┆ null     │
│ C     ┆ B       ┆ null     │
│ A     ┆ C       ┆ 3        │
│ B     ┆ C       ┆ 2        │
│ C     ┆ C       ┆ null     │
└───────┴─────────┴──────────┘

然后我可以用例如过滤

df = df.drop_nulls()
,但我想直接从融化中得到这个想要的结果:

#desired result: 
df


shape: (3, 3)
┌───────┬─────────┬──────────┐
│ names ┆ names_2 ┆ distance │
│ ---   ┆ ---     ┆ ---      │
│ str   ┆ str     ┆ i64      │
╞═══════╪═════════╪══════════╡
│ A     ┆ B       ┆ 2        │
│ A     ┆ C       ┆ 3        │
│ B     ┆ C       ┆ 2        │
└───────┴─────────┴──────────┘
filter null python-polars pandas-melt
1个回答
0
投票

您可以创建可迭代的数据帧,稍后可以单独连接或处理

pl.concat(
    df.filter(pl.col(c).is_not_null()).select(
        names = pl.lit(c),
        names_2 = pl.col.names,
        distance = pl.col(c)
    ) for c in df.schema.keys() if c != "names"
)
shape: (3, 3)
┌───────┬─────────┬──────────┐
│ names ┆ names_2 ┆ distance │
│ ---   ┆ ---     ┆ ---      │
│ str   ┆ str     ┆ i64      │
╞═══════╪═════════╪══════════╡
│ A     ┆ B       ┆ 2        │
│ A     ┆ C       ┆ 3        │
│ B     ┆ C       ┆ 2        │
└───────┴─────────┴──────────┘
© www.soinside.com 2019 - 2024. All rights reserved.