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
相关产品推荐
相关产品推荐

