如何先计算complete_versions,再据此生成df_1_new?
分步实现:筛选完整版本并生成目标数据集
需求说明
验证df_2中每个version对应的所有scope均存在于df_1中,先得到满足该条件的complete_versions列表,再基于此从df_1中筛选对应scope的记录生成df_1_new。
输入数据集
import pandas as pd # 初始化df_1 df_1 = pd.DataFrame({ 'my_id': [23784, 23794, 23774, 22784, 23564, 20784], 'scope': ['some_code', 'some_cod1', 'some_cod2', 'some_cod3', 'some_cod5', 'some_cod6'], 'feat_1': ['Three', 'Seven', 'Three', 'Two', 'Five', 'Five'], 'value_1': [30, 60, 90, 30, 20, 10], 'value_2': [60, 40, 40, 10, 40, 70], 'value_3': [60, 20, 60, 60, 20, 40], 'date': ['2022-01-01', '2022-01-01', '2022-01-02', '2022-01-03', '2022-02-08', '2022-02-15'] }) # 初始化df_2 df_2 = pd.DataFrame({ 'scope': ['some_code', 'some_cod1', 'some_cod2', 'some_cod3', 'some_cod4', 'some_cod5', 'some_cod6', 'some_cod7'], 'feat_1': ['Three', 'Seven', 'Three', 'Two', 'Four', 'Five', 'Five', 'Four'], 'date': ['2022-01-01', '2022-01-01', '2022-01-02', '2022-01-03', '2022-01-05', '2022-02-08', '2022-02-15', '2022-02-15'], 'version': [100, 100, 200, 350, 650, 700, 800, 800] })
步骤1:生成complete_versions
核心逻辑是按version分组,校验组内所有scope都存在于df_1的scope集合中,再筛选出符合条件的行:
# 获取df_1中所有存在的scope集合,用于快速判断 df1_scope_set = set(df_1['scope']) # 按version分组,检查每个组的所有scope是否都在df1_scope_set里 valid_versions = df_2.groupby('version').filter( lambda group: all(scope in df1_scope_set for scope in group['scope']) ) # 提取需要的version和scope列,得到complete_versions complete_versions = valid_versions[['version', 'scope']]
运行后得到的complete_versions:
version scope 0 100 some_code 1 100 some_cod1 2 200 some_cod2 3 350 some_cod3 5 700 some_cod5
步骤2:生成df_1_new
从complete_versions中提取唯一的scope列表,再在df_1中筛选对应记录:
# 获取complete_versions中所有唯一的scope valid_scopes = complete_versions['scope'].unique() # 筛选df_1中scope属于valid_scopes的记录 df_1_new = df_1[df_1['scope'].isin(valid_scopes)]
运行后得到的df_1_new:
my_id scope feat_1 value_1 value_2 value_3 date 0 23784 some_code Three 30 60 60 2022-01-01 1 23794 some_cod1 Seven 60 40 20 2022-01-01 2 23774 some_cod2 Three 90 40 60 2022-01-02 3 22784 some_cod3 Two 30 10 60 2022-01-03 4 23564 some_cod5 Five 20 40 20 2022-02-08
内容的提问来源于stack exchange,提问作者johnnydoe
相关产品推荐
相关产品推荐

