You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中批量查找数值首次出现的行索引?

高效获取Pandas DataFrame中1-50数值的首次出现行索引

嘿,手动查每个数值的首次出现位置确实太繁琐了!咱们完全可以利用Pandas的向量化操作来一次性搞定这个需求,下面给你几种实用的方法:

方法一:宽转长格式 + 分组聚合(推荐,适合大数据集)

这种方法是最贴合Pandas设计思路的,效率很高,尤其适合你说的大规模数据集:

  1. 先把行索引转为单独一列(方便后续追踪):
import pandas as pd

# 假设你的DataFrame叫lotteryData
lotteryData = lotteryData.reset_index().rename(columns={'index': 'row_idx'})
  1. 将N1到N5的宽格式列转为长格式,让每个数值和对应的行索引一一对应:
long_format = lotteryData.melt(
    id_vars=['row_idx', 'date'],
    value_vars=['N1', 'N2', 'N3', 'N4', 'N5'],
    value_name='number'
)
  1. 按数值分组,取每组最小的行索引(也就是首次出现的位置):
first_occurrences = long_format.groupby('number')['row_idx'].min()
  1. 筛选出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:48:14