我有一个大的极坐标数据框,我需要
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 │
└───────┴─────────┴──────────┘
您可以创建可迭代的数据帧,稍后可以单独连接或处理
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 │
└───────┴─────────┴──────────┘