我开始使用极坐标,并且仍在学习语法。
我想实现一个groupby,然后是一个交叉连接(笛卡尔积),我想在每个组内的每个组合之间运行计算。 (也可以理解为条件连接)。
我在下面得到了一个示例数据框:
import polars as pl
df = pl.DataFrame(
{
"garment": ["tshirt", "tshirt", "tshirt", "pants", "pants", "pants", "socks", "socks", "socks"],
"color": ["red", "blue", "green", "yellow", "orange", "purple", "black", "white", "grey"],
"price": [100, 50, 75, 101, 51, 69, 99, 44, 32]
}
)
print(df)
我弄清楚了如何选择一组(在本例中:所有裤子),以及如何计算所有商品之间的价格差异。
# for one group
df_pants = df.filter(pl.col('garment') == 'pants')
df_pants.join(df_pants, how="cross").filter(
pl.col('color') != pl.col('color_right') # avoid self-joins
).with_columns(
(pl.col('price') - pl.col('price_right')).abs().alias('difference')
)
但我想编写一个极坐标表达式,首先按“服装”对整个数据集进行分组,然后在每个组内执行连接;最后运行计算(在本例中为价格差异)。
如有任何帮助,我们将不胜感激!
编辑:
此外,我只想拥有独特的组合。所以只有“橙”和“黄”,而不是“黄”和“橙”。
.join_where()
已添加。
您可以将“过滤器”放在连接谓词中。
df.join_where(df,
pl.col.garment == pl.col.garment_right,
pl.col.index < pl.col.index_right
)
您可以在
garment
列上执行自连接。
如果在加入之前添加行索引,则可以在过滤条件中使用它来防止“重复”。
df = df.with_row_index()
(df.join(df, on="garment")
.filter(pl.col.index < pl.col.index_right)
)
shape: (9, 7)
┌───────┬─────────┬────────┬───────┬─────────────┬─────────────┬─────────────┐
│ index ┆ garment ┆ color ┆ price ┆ index_right ┆ color_right ┆ price_right │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ u32 ┆ str ┆ str ┆ i64 ┆ u32 ┆ str ┆ i64 │
╞═══════╪═════════╪════════╪═══════╪═════════════╪═════════════╪═════════════╡
│ 0 ┆ tshirt ┆ red ┆ 100 ┆ 1 ┆ blue ┆ 50 │
│ 0 ┆ tshirt ┆ red ┆ 100 ┆ 2 ┆ green ┆ 75 │
│ 1 ┆ tshirt ┆ blue ┆ 50 ┆ 2 ┆ green ┆ 75 │
│ 3 ┆ pants ┆ yellow ┆ 101 ┆ 4 ┆ orange ┆ 51 │
│ 3 ┆ pants ┆ yellow ┆ 101 ┆ 5 ┆ purple ┆ 69 │
│ 4 ┆ pants ┆ orange ┆ 51 ┆ 5 ┆ purple ┆ 69 │
│ 6 ┆ socks ┆ black ┆ 99 ┆ 7 ┆ white ┆ 44 │
│ 6 ┆ socks ┆ black ┆ 99 ┆ 8 ┆ grey ┆ 32 │
│ 7 ┆ socks ┆ white ┆ 44 ┆ 8 ┆ grey ┆ 32 │
└───────┴─────────┴────────┴───────┴─────────────┴─────────────┴─────────────┘