Pandas与Plotly中ValueError: min() arg is an empty sequence错误求助
解决ValueError: min() arg is an empty sequence问题
问题原因
你的代码尝试为每个指定项目收集金牌选手的年龄数据,但部分项目在athlete_df中没有符合条件的金牌选手记录(或年龄数据全部为空),导致x列表中混入了空的Series对象。当Plotly的create_distplot处理这些空序列时,执行min(trace)就会触发空序列的报错。
解决方案
方案1:循环中过滤空序列
遍历项目时,只将非空的年龄序列添加到x和name中:
athlete_df = df.drop_duplicates(subset={'Name','region'}) x = [] name = [] famous_sports = ['Basketball', 'Judo', 'Football', 'Athletics', 'Swimming', 'Badminton', 'Sailing', 'Gymnastics', 'Handball', 'Weightlifting', 'Wrestling','Water Polo', 'Hockey', 'Rowing', 'Fencing', 'Shooting', 'Boxing', 'Taekwondo', 'Cycling', 'Diving', 'Canoeing', 'Tennis', 'Golf', 'Softball', 'Archery', 'Volleyball', 'Table Tennis', 'Baseball', 'Rhythmic Gymnastics', 'Trampolining', 'Beach Volleyball', 'Triathlon', 'Rugby', 'Polo', 'Cricket', 'Ice Hockey', 'Racquets', 'Motorboating', 'Croquet', 'Figure Skating','Aeronautics'] for sport in famous_sports: temp = athlete_df[athlete_df['Sport'] == sport] gold_ages = temp[temp['Medal'] == 'Gold']['Age'].dropna() # 仅添加非空的年龄数据 if not gold_ages.empty: x.append(gold_ages) name.append(sport) fig = ff.create_distplot(x, name, show_hist=False, show_rug=False) fig.show()
方案2:提前筛选有效项目
先从数据中提取存在金牌记录的项目,再从famous_sports中筛选出有效项,避免无效遍历:
athlete_df = df.drop_duplicates(subset={'Name','region'}) # 获取所有有金牌记录的项目 valid_gold_sports = athlete_df[athlete_df['Medal'] == 'Gold']['Sport'].unique() # 筛选famous_sports中存在有效数据的项目 filtered_sports = [s for s in famous_sports if s in valid_gold_sports] x = [] name = [] for sport in filtered_sports: temp = athlete_df[athlete_df['Sport'] == sport] gold_ages = temp[temp['Medal'] == 'Gold']['Age'].dropna() x.append(gold_ages) name.append(sport) fig = ff.create_distplot(x, name, show_hist=False, show_rug=False) fig.show()
原理说明
两种方案都是确保x列表中的每个元素都是非空的年龄序列,这样Plotly在计算分布曲线的起始和结束值时,min(trace)和max(trace)就能正常获取到数值,不会触发空序列的报错。
内容的提问来源于stack exchange,提问作者Rishi Chakraborty
相关产品推荐
相关产品推荐

