我有一個包含兩列的極坐標資料框,兩列都是串列。
df = pl.DataFrame({
'a': [[True, False], [False, True]],
'b': [['name1', 'name2'], ['name3', 'name4']]
})
df
shape: (2, 2)
┌───────────────┬────────────────────┐
│ a ┆ b │
│ --- ┆ --- │
│ list[bool] ┆ list[str] │
╞═══════════════╪════════════════════╡
│ [true, false] ┆ ["name1", "name2"] │
├???????????????┼????????????????????┤
│ [false, true] ┆ ["name3", "name4"] │
└───────────────┴────────────────────┘
我想b使用列a作為布爾掩碼過濾列。column 中每個串列的a長度始終與 column 中每個串列的長度相同b。
我可以考慮使用explode,然后過濾、聚合和執行join,但在某些情況下連接列不可用,為了簡單起見,我寧愿避免使用這種方法。
還有其他方法可以使用另一個串列作為布爾掩碼來過濾串列嗎?我嘗試過使用.arr.eval,但它似乎不接受涉及其他列的操作。
任何幫助,將不勝感激!
uj5u.com熱心網友回復:
這不是最理想的解決方案,因為我們對資料進行了整理,以便為每個串列爆炸到它的元素組成一個組。然后我們再次按該組分組并應用過濾器。
df = pl.DataFrame({
'a': [[True, False], [False, True]],
'b': [['name1', 'name2'], ['name3', 'name4']]
})
(df.with_row_count()
.explode(["a", "b"])
.groupby("row_nr")
.agg([
pl.col("b").filter(pl.col("a"))
])
)
shape: (2, 2)
┌────────┬───────────┐
│ row_nr ┆ b │
│ --- ┆ --- │
│ u32 ┆ list[str] │
╞════════╪═══════════╡
│ 1 ┆ ["name4"] │
├????????┼???????????┤
│ 0 ┆ ["name1"] │
└────────┴───────────┘
也許我們可以在極地想出更好的東西。如果arr.eval可以訪問其他列,那就太好了。待定!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484937.html
