Plotly-Python中使用px.scatter触发InvalidIndexError的解决办法
问题描述
现有如下Pandas DataFrame:
dff8df !!!0 WWSF VPIP VPIP VPIP 0 52.0 38.64 38.64 38.64 1 62.0 50.00 50.00 50.00 2 73.0 56.25 56.25 56.25 3 99.0 23.08 23.08 23.08 4 30.0 41.67 41.67 41.67 .. ... ... ... ... 540 50.0 18.75 18.75 18.75 541 99.0 26.32 26.32 26.32 542 50.0 28.57 28.57 28.57 543 83.0 14.29 14.29 14.29 544 57.0 38.89 38.89 38.89 [545 rows x 4 columns]
运行以下Plotly代码时触发错误:
print("dff8df",dff8) figure = px.scatter(data_frame=dff8, x=dff8[:,drop1], y=dff8[:,drop2], color=dff8[:,drop4], size=dff8[:,drop3], trendline="ols", trendline_color_override="red", title="%s vs %s"%(drop1, drop2), )
错误信息:
pandas.errors.InvalidIndexError: (slice(None, None, None), 'VPIP')
解决方案
1. 核心错误原因
- Pandas DataFrame不支持
[:, 列名]这种混合切片语法(这是NumPy数组的用法),直接使用会触发索引错误。 - DataFrame存在重复列名(多个
VPIP),会进一步导致索引歧义。
2. 修正步骤
步骤1:重命名重复列
先给重复的VPIP列赋予唯一名称,避免索引混乱:
# 重命名所有列,确保名称唯一 dff8.columns = ['!!!0 WWSF', 'VPIP_1', 'VPIP_2', 'VPIP_3']
步骤2:调整Plotly代码的列引用方式
Plotly Express的px.scatter可以直接通过列名字符串从data_frame中取数,无需手动切片。修正后的代码如下:
# 假设drop1、drop2、drop3、drop4是重命名后的列名(比如drop1='!!!0 WWSF',drop2='VPIP_1'等) figure = px.scatter(data_frame=dff8, x=drop1, y=drop2, color=drop4, size=drop3, trendline="ols", trendline_color_override="red", title=f"{drop1} vs {drop2}", )
补充:如果需要按位置索引列
如果drop1等变量存储的是列的位置索引(而非列名),可以用iloc来取列:
figure = px.scatter(data_frame=dff8, x=dff8.iloc[:, drop1], y=dff8.iloc[:, drop2], color=dff8.iloc[:, drop4], size=dff8.iloc[:, drop3], trendline="ols", trendline_color_override="red", title=f"{dff8.columns[drop1]} vs {dff8.columns[drop2]}", )
内容的提问来源于stack exchange,提问作者boxertrain
相关产品推荐
相关产品推荐

