如何在Pandas DataFrame中批量查找数值首次出现的行索引?
高效获取Pandas DataFrame中1-50数值的首次出现行索引
嘿,手动查每个数值的首次出现位置确实太繁琐了!咱们完全可以利用Pandas的向量化操作来一次性搞定这个需求,下面给你几种实用的方法:
方法一:宽转长格式 + 分组聚合(推荐,适合大数据集)
这种方法是最贴合Pandas设计思路的,效率很高,尤其适合你说的大规模数据集:
- 先把行索引转为单独一列(方便后续追踪):
import pandas as pd # 假设你的DataFrame叫lotteryData lotteryData = lotteryData.reset_index().rename(columns={'index': 'row_idx'})
- 将N1到N5的宽格式列转为长格式,让每个数值和对应的行索引一一对应:
long_format = lotteryData.melt( id_vars=['row_idx', 'date'], value_vars=['N1', 'N2', 'N3', 'N4', 'N5'], value_name='number' )
- 按数值分组,取每组最小的行索引(也就是首次出现的位置):
first_occurrences = long_format.groupby('number')['row_idx'].min()
- 筛选出1-50的数值结果:
result = first_occurrences.loc[range(1, 51)] # 转成DataFrame更直观 result_df = result.reset_index().rename(columns={'row_idx': 'first_row_index'})
方法二:遍历数值 + 逐值查找(直观易理解)
如果你更喜欢逻辑直白的写法,可以遍历1-50的每个数值,用isin和idxmax找到首次出现的索引:
first_occurrence_dict = {} for num in range(1, 51): # 检查每一行的N1-N5列是否包含当前数值 has_num = lotteryData[['N1', 'N2', 'N3', 'N4', 'N5']].isin([num]).any(axis=1) if has_num.any(): # idxmax返回第一个True的位置,也就是首次出现的行索引 first_occurrence_dict[num] = has_num.idxmax() else: # 如果数值从未出现,标记为None first_occurrence_dict[num] = None # 转为DataFrame查看 result_df = pd.DataFrame.from_dict( first_occurrence_dict, orient='index', columns=['first_row_index'] )
额外:如果要从main列的字符串格式处理
如果你想直接用main列的5-23-28-38-49格式来处理,也可以拆分后再操作:
# 拆分main列为数值列表,并展开成每行一个数值 lotteryData['numbers'] = lotteryData['main'].str.split('-').astype(int) expanded_df = lotteryData.explode('numbers').reset_index() # 同样分组取最小索引 first_occurrences = expanded_df.groupby('numbers')['index'].min() result = first_occurrences.loc[range(1, 51)]
这几种方法都能帮你摆脱手动查询的麻烦,其中方法一的向量化操作效率最高,推荐优先使用~
内容的提问来源于stack exchange,提问作者user1478335
相关产品推荐
相关产品推荐

