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

Python计算机构付费转化率时触发IndexError问题求助

问题:计算机构付费转化率触发IndexError

数据集示例

n agencyname paid(yes/not)

1 agencyA 1
2 agencyB 0
3 agencyC 0
4 agencyB 1
5 agencyA 0
6 agencyA 1
7 agencyB 1
...

原代码

for value in set(df["agencyname"]):
        print("payd conversion rate for", value, "is:")
        print(df[(df["agencyname"]==value)]["paid"].value_counts()[1]/len(df[(df["agencyname"]==value)]["paid"]))

错误信息

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [627], in <cell line: 1>()
      1 for value in set(df["agencyname"]):
      2         print("payd rate for", value, "is:")
----> 3         print(df[(df["agencyname"]==value)]["paid"].value_counts()[1]/len(df[(df["agencyname"]==value)]["paid"]))

File ~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/series.py:955, in Series.__getitem__(self, key)
    952     key = unpack_1tuple(key)
    954 if is_integer(key) and self.index._should_fallback_to_positional:
---> 955     return self._values[key]
    957 elif key_is_scalar:
    958     return self._get_value(key)

IndexError: index 1 is out of bounds for axis 0 with size 1

错误原因

当某个机构的所有paid记录都是0时,value_counts()返回的Series只有索引0(对应计数),此时强行访问索引1就会触发越界错误。

解决方案

方法1:用get()方法安全取值

通过get(1, 0)指定当索引1不存在时返回0,避免报错:

for value in set(df["agencyname"]):
    paid_series = df[df["agencyname"] == value]["paid"]
    paid_count = paid_series.value_counts().get(1, 0)
    conversion_rate = paid_count / len(paid_series)
    print(f"paid conversion rate for {value} is: {conversion_rate}")

方法2:用pandas分组均值(推荐)

因为paid是0/1数值型,分组后直接取均值就是转化率,代码更简洁高效,无需循环:

conversion_rates = df.groupby("agencyname")["paid"].mean()
print(conversion_rates)

方法3:检查索引是否存在

先判断1是否在value_counts的索引中,再执行计算:

for value in set(df["agencyname"]):
    subset_counts = df[df["agencyname"] == value]["paid"].value_counts()
    paid_count = subset_counts[1] if 1 in subset_counts.index else 0
    total_count = len(df[df["agencyname"] == value])
    conversion_rate = paid_count / total_count
    print(f"paid conversion rate for {value} is: {conversion_rate}")

内容的提问来源于stack exchange,提问作者Gianluca Tursi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:20:15