如何从另一DataFrame随机抽取关联列值添加到目标DataFrame
实现方法
核心原则:随机抽取时必须以ID-Value的完整行为单位做随机,禁止拆分ID、Value两列分别随机,否则会破坏两列的原有对应关系。
以下是两种最常用场景的可直接运行的实现代码:
- 关系型数据库(以MySQL为例,其他数据库仅需调整随机函数即可适配)
-- 以下为测试数据构造段,实际使用时替换为自身业务表即可 WITH year_table AS ( SELECT 1 AS Year UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 ), id_value_table AS ( SELECT 1 AS ID, 10 AS Value UNION ALL SELECT 2, 50 UNION ALL SELECT 3, 25 UNION ALL SELECT 4, 20 UNION ALL SELECT 5, 40 ) -- 核心匹配逻辑 SELECT y.Year, iv.ID, iv.Value FROM year_table y INNER JOIN ( SELECT ID, Value, -- 给每个ID-Value对生成随机序号 ROW_NUMBER() OVER(ORDER BY RAND()) AS rand_rank FROM id_value_table ) iv -- 给每个Year行随机匹配1组完整的ID-Value对 ON iv.rand_rank = 1 + FLOOR(RAND() * (SELECT COUNT(*) FROM id_value_table));
- Python Pandas 数据分析场景
import pandas as pd # 构造测试数据,实际使用时替换为读取自身表的逻辑即可 year_df = pd.DataFrame({"Year": [1, 2, 3, 4]}) id_value_df = pd.DataFrame({ "ID": [1, 2, 3, 4, 5], "Value": [10, 50, 25, 20, 40] }) # 核心逻辑:按行随机抽取与Year行数等量的ID-Value记录,直接横向拼接保证映射关系不错乱 result_df = pd.concat( [ year_df.reset_index(drop=True), # 如需禁止重复抽取同一组ID-Value,将replace参数改为False即可(需保证ID-Value表行数≥Year表行数) id_value_df.sample(n=len(year_df), replace=True).reset_index(drop=True) ], axis=1 )
运行后即可得到包含Year、ID、Value三列的结果,每一行Year对应一组绑定关系正确的随机ID-Value对。
内容的提问来源于stack exchange,提问作者Richard Dixon
相关产品推荐
相关产品推荐

