如何在Python Pandas中随机选取行,使选中值之和为总值的30%?
Pandas随机选取行满足Value和为总值30%的实现
1. 先明确目标值
首先计算Value列的总和,再乘以30%得到目标和。以你提供的数据为例:
import pandas as pd import numpy as np # 读取CSV数据(替换为你的文件路径) df = pd.read_csv('your_file.csv') # 计算总值与目标和 total_value = df['Value'].sum() target_sum = total_value * 0.3
你的示例数据中,total_value=81,target_sum=24.3——由于所有Value都是整数,无法找到精确匹配的子集,这种情况可以考虑取整(比如调整为24),或者允许微小误差。
2. 随机搜索实现(适合大多数场景)
如果数据量不算太大,直接用随机采样的方式循环尝试,直到找到符合条件的子集:
def find_matching_subset(df, target, max_tries=10000): for _ in range(max_tries): # 随机选择1到总行数之间的行数 sample_size = np.random.randint(1, len(df)+1) sampled_rows = df.sample(n=sample_size) current_sum = sampled_rows['Value'].sum() # 允许0.1的误差(处理浮点数精度问题),如果需要精确整数匹配,改成current_sum == int(target) if abs(current_sum - target) < 0.1: return sampled_rows # 多次尝试未找到的情况 return None # 调用函数获取结果 result = find_matching_subset(df, target_sum) if result is not None: print("找到符合条件的子集:") print(result) else: print(f"尝试{max_tries}次未找到匹配子集,可尝试增大次数或调整目标值")
3. 精确枚举子集(仅适合小数据量)
如果必须精确匹配,且数据行数很少(比如≤20),可以枚举所有可能的子集组合:
from itertools import combinations def find_exact_match_subset(df, target): row_count = len(df) # 遍历所有可能的子集大小(1到总行数) for subset_size in range(1, row_count+1): # 生成所有该大小的索引组合 for index_combo in combinations(df.index, subset_size): subset = df.loc[index_combo] if subset['Value'].sum() == target: return subset return None # 示例:如果把目标值调整为24(整数),会返回Value和为24的子集 # result = find_exact_match_subset(df, 24)
注意要点
- 数据量较大时(行数>20),枚举子集的方法会因组合爆炸变得极慢,优先用随机搜索或启发式算法(如遗传算法)。
- 浮点数场景下,避免直接用
==判断相等,改用误差范围匹配。 - 随机搜索的尝试次数越多,找到匹配的概率越高,但耗时也会相应增加,可根据实际情况调整
max_tries参数。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

