如何不使用for循环,基于行匹配填充列并获取年度计数?
不用For循环匹配填充表格数据的解决方案
没问题!针对你这个需求,我们可以用Python的Pandas库来实现完全不用for循环的匹配填充,核心思路是利用Pandas的矢量化操作(合并或映射),结合分组筛选来精准匹配数据。
第一步:准备数据
先把你提供的表格转换成Pandas DataFrame(这是处理表格数据的标准操作):
import pandas as pd # 主数据表 main_df = pd.DataFrame({ 'Name': ['Nemo', 'Dora'], 'State': ['NY', 'CA'], 'Age': [5, 2], 'Species': ['Clownfish', 'Regal Tang'], 'Annual Ct': ['?', '?'] }) # 查找表 lookup_df = pd.DataFrame({ 'State': ['NY', 'NY', 'CA', 'CA', 'CA'], 'Species': ['Clownfish', 'Clownfish', 'Regal Tang', 'Regal Tang', 'Regal Tang'], 'Year': [2012, 2014, 2001, 2014, 2000], 'AnnualCt': [500, 200, 400, 680, 700] })
第二步:处理查找表(按需筛选)
从你的预期输出可以推断,你需要每个State+Species组合取最新年份的AnnualCt(Nemo对应2014年的200,是该组合的最新数据)。我们先对查找表分组筛选:
# 按年份排序后,保留每个State+Species组的最后一行(即最新年份数据) latest_lookup = lookup_df.sort_values('Year').groupby(['State', 'Species']).last().reset_index()
第三步:匹配填充主表
这里有两种常用方法,都不需要for循环:
方法1:用Merge合并表格
这是最直观的方式,通过匹配State和Species两个键来关联数据:
# 合并主表和筛选后的查找表,保留主表所有行 result_df = pd.merge( main_df.drop('Annual Ct', axis=1), # 先移除原有的占位列 latest_lookup[['State', 'Species', 'AnnualCt']], # 只保留需要匹配的列 on=['State', 'Species'], how='left' ) # 重命名列名匹配预期输出 result_df = result_df.rename(columns={'AnnualCt': 'Annual Ct'})
运行后得到的结果完全符合你的预期:
| Name | State | Age | Species | Annual Ct |
|---|---|---|---|---|
| Nemo | NY | 5 | Clownfish | 200 |
| Dora | CA | 2 | Regal Tang | 680 |
方法2:用字典映射填充
如果想更简洁,也可以把查找表转换成字典,再用apply+map填充:
# 把查找表转换成(State, Species)为键、AnnualCt为值的字典 lookup_dict = latest_lookup.set_index(['State', 'Species'])['AnnualCt'].to_dict() # 直接映射填充主表列 main_df['Annual Ct'] = main_df.apply( lambda x: lookup_dict.get((x['State'], x['Species']), '?'), axis=1 )
扩展:如果需要匹配特定年份
如果你的主表其实包含Year列(只是示例里没写),只需要把Year也加入匹配键即可:
# 假设主表新增Year列 main_df['Year'] = [2014, 2014] # 按State、Species、Year三键合并 result_df_year = pd.merge( main_df.drop('Annual Ct', axis=1), lookup_df[['State', 'Species', 'Year', 'AnnualCt']], on=['State', 'Species', 'Year'], how='left' ).rename(columns={'AnnualCt': 'Annual Ct'})
这些方法都是利用Pandas的矢量化特性,比for循环效率高得多,尤其是处理大规模数据时优势明显。
内容的提问来源于stack exchange,提问作者user4852067
相关产品推荐
相关产品推荐

