Polars是否支持对每组分对数据应用自定义函数的操作?
Polars是否支持对每组分对数据应用自定义函数的操作?
当然支持啦!其实你可以通过几个简单的步骤轻松实现这个需求,我结合你的示例数据给你拆解一下具体怎么做:
首先,得先拿到所有需要处理的组对组合。你可以用Python标准库的itertools.combinations快速生成所有两两不重复的组对,不用自己手动写嵌套循环折腾:
from itertools import combinations import polars as pl import numpy as np # 先还原你的示例DataFrame num_points = 10 group_count = 3 df = pl.DataFrame( { "group_id": np.concatenate([[i]*num_points for i in range(group_count)]), "data": np.concatenate([np.random.rand(num_points) for _ in range(group_count)]), } ) # 获取所有唯一的组ID unique_groups = df["group_id"].unique().to_list() # 生成所有两两不重复的组对(比如(0,1)、(0,2)、(1,2)) group_pairs = list(combinations(unique_groups, 2))
接下来,定义你自己的自定义操作函数就行。比如假设你想计算两组数据的皮尔逊相关系数,就可以这么写:
def custom_group_op(group_a_data, group_b_data): # 这里直接替换成你实际需要的业务逻辑就行 return np.corrcoef(group_a_data, group_b_data)[0, 1]
然后就可以遍历每个组对,取出对应组的数据,应用函数,最后把结果整理成Polars DataFrame方便后续处理:
results = [] for g1, g2 in group_pairs: # 提取两组的data列数据(转成numpy数组还是保留Polars Series,看你函数的需求来) data_g1 = df.filter(pl.col("group_id") == g1)["data"].to_numpy() data_g2 = df.filter(pl.col("group_id") == g2)["data"].to_numpy() # 执行自定义操作 op_result = custom_group_op(data_g1, data_g2) # 把结果存入列表 results.append({ "group_pair": f"组{g1}-组{g2}", "操作结果": op_result }) # 转成Polars DataFrame方便查看和后续处理 result_df = pl.DataFrame(results) print(result_df)
如果你的自定义函数能兼容Polars的向量化操作,还能进一步优化运行效率,但要是必须用特定自定义逻辑的场景,上面的方法已经足够直观好用了——毕竟组对的数量一般不会特别大,这种方式调试起来也很方便。
内容来源于stack exchange
相关产品推荐
相关产品推荐

