如何匹配共同值生成新DataFrame:跨年份州-行业匹配需求
解决思路和实现代码
这个需求核心是找到每个州在两年间重叠的行业,还要处理多行业拆分显示的情况,我给你一步步实现:
1. 整理所有涉及的州(保持和示例一致的顺序)
首先我们需要把两年里出现的所有州都列出来,而且要和你给出的示例顺序匹配——先放2019年出现过的州,再放2020年新增的州:
# 获取2019年的唯一州列表 states_2019_unique = data_2019['state'].unique() # 获取2020年里没在2019出现过的州 states_2020_new = data_2020[~data_2020['state'].isin(states_2019_unique)]['state'].unique() # 合并成最终的州列表 all_states = list(states_2019_unique) + list(states_2020_new)
2. 提取每个州两年的行业集合
我们把两年的数据按州分组,把每个州的行业转换成集合,这样方便后续求交集:
# 2019年每个州的行业集合 state_inds_2019 = data_2019.groupby('state')['industry'].apply(set).to_dict() # 2020年每个州的行业集合 state_inds_2020 = data_2020.groupby('state')['industry'].apply(set).to_dict()
3. 构造目标数据的列表
接下来遍历每个州,计算共同行业,然后生成符合要求的行数据——如果有多个共同行业,每个行业单独占一行,且共同行业数量都填总个数:
data_both_rows = [] for state in all_states: # 取出该州两年的行业集合,没有的话用空集合 inds_2019 = state_inds_2019.get(state, set()) inds_2020 = state_inds_2020.get(state, set()) # 求交集得到共同行业 common_inds = inds_2019 & inds_2020 count = len(common_inds) if common_inds: # 有共同行业,每个行业生成一行 for ind in common_inds: data_both_rows.append({ 'state': state, 'common_industry': ind, 'common_industry_count': count }) else: # 没有共同行业,生成一行空值+0 data_both_rows.append({ 'state': state, 'common_industry': '', 'common_industry_count': 0 })
4. 转换成目标DataFrame
最后把列表转成DataFrame就搞定了:
data_both = pd.DataFrame(data_both_rows)
运行这段代码后,生成的data_both就和你给出的示例完全一致啦。
内容的提问来源于stack exchange,提问作者NonSleeper
相关产品推荐
相关产品推荐

