如何筛选Pandas DataFrame使A、B列value_counts达指定值?
实现DataFrame按指定value_counts目标筛选的方法
完全可以实现这个需求,前提是当前各值的计数都不小于目标计数(你的数据满足这个条件)。以下是具体的Pandas实现方案:
步骤1:定义目标计数字典
首先把列A和列B的目标计数转换成Pandas Series,方便后续匹配:
import pandas as pd # 假设原数据集为df target_a = pd.Series({5:2, 10:7, 15:13, 20:10, 25:15, 30:8, 35:8}, name='target_a') # 注意:原数据中B列的"-0"会被Pandas识别为0,所以目标字典中用0对应 target_b = pd.Series({-30:3, -20:6, -10:16, 0:25, 10:7, 20:4, 30:2}, name='target_b')
步骤2:分两次抽样满足双目标
先按列A的目标数量筛选,再在结果中按列B的目标数量筛选,确保最终两列的value_counts都符合要求:
# 第一步:按A列分组,每个值抽取目标数量的样本 df_filtered_a = df.groupby('A', group_keys=False).apply( lambda group: group.sample(n=target_a[group.name], random_state=42) ) # 第二步:在A列筛选后的结果中,按B列分组抽取目标数量的样本 df_final = df_filtered_a.groupby('B', group_keys=False).apply( lambda group: group.sample(n=target_b[group.name], random_state=42) )
验证结果
执行以下代码可以验证筛选后的结果是否符合目标:
print("列A的value_counts结果:") print(df_final['A'].value_counts().sort_index()) print("\n列B的value_counts结果:") print(df_final['B'].value_counts().sort_index())
补充说明
random_state=42用于保证抽样结果可复现,不需要固定结果的话可以去掉这个参数。- 如果担心两次抽样后某列的目标数量不满足(你的数据不存在这个问题),可以调整抽样顺序,比如先按B列筛选再按A列筛选。
内容的提问来源于stack exchange,提问作者metanoia
相关产品推荐
相关产品推荐

