如何按特征列在Pandas DataFrame中随机选单日值并缩减矩阵?
我来帮你搞定这个需求!根据你的描述,这里有两种常见的实现方式,对应两种可能的理解场景,你可以根据实际需求选择:
场景1:每个特征统一随机选一天(所有用户的该特征都取这天的值)
比如feature0随机选中第1天,那所有用户的feature0都取自己dayID=1对应的值。实现代码如下:
import pandas as pd import numpy as np # 模拟你的原始数据(替换成你实际的DataFrame即可) data = { 'userID': ['xy1', 'xy1', 'xy1', 'gh3', 'gh3', 'gh3'], 'dayID': [0,1,2,0,1,2], 'feature0': [24,5,30,50,49,4], 'feature1': [15.3,24,7,4,3,9], 'feature2': [41,34,8,11,59,12], 'feature3': [43,40,10,12,11,15] } df = pd.DataFrame(data) # 1. 定义所有特征列 feature_cols = [col for col in df.columns if col.startswith('feature')] # 2. 为每个特征随机挑选0/1/2中的一天 selected_days = {feat: np.random.choice([0,1,2]) for feat in feature_cols} print(f"各特征选中的dayID:{selected_days}") # 3. 构建结果DataFrame result = df[['userID']].drop_duplicates().reset_index(drop=True) for feat, day in selected_days.items(): # 提取该特征对应dayID的数据 feat_data = df[df['dayID'] == day][['userID', feat]] # 合并到结果中 result = result.merge(feat_data, on='userID', how='left') print(result)
运行后会得到类似这样的结果(取决于随机选中的dayID):
userID feature0 feature1 feature2 feature3 0 xy1 5 15.3 41 10 1 gh3 49 4.0 11 15
场景2:每个用户的每个特征各自随机选一天(每个用户的特征值从自己的三天数据里随机挑)
如果是每个用户的每个特征都独立随机选取自己三天中的某一天数据,那可以用分组+自定义函数的方式实现:
import pandas as pd import numpy as np # 同样先准备数据(替换成你的实际DataFrame) data = { 'userID': ['xy1', 'xy1', 'xy1', 'gh3', 'gh3', 'gh3'], 'dayID': [0,1,2,0,1,2], 'feature0': [24,5,30,50,49,4], 'feature1': [15.3,24,7,4,3,9], 'feature2': [41,34,8,11,59,12], 'feature3': [43,40,10,12,11,15] } df = pd.DataFrame(data) feature_cols = [col for col in df.columns if col.startswith('feature')] # 定义分组内的随机选择函数 def pick_random_day(group): selected_vals = {'userID': group['userID'].iloc[0]} for feat in feature_cols: # 从当前用户的该特征列中随机选一个值 selected_vals[feat] = group[feat].sample(n=1).values[0] return pd.Series(selected_vals) # 按userID分组应用函数 result = df.groupby('userID').apply(pick_random_day).reset_index(drop=True) print(result)
这种方式每次运行结果都会不同,因为每个用户的每个特征都是独立随机选取的。
内容的提问来源于stack exchange,提问作者user1357015
相关产品推荐
相关产品推荐

