使用Pandas向空列表添加元素时过滤条件失效问题求助
问题分析与修正
代码里的核心问题
- 判断条件错误:
if ([Leg['Total'] > 500])逻辑完全不对。Leg['Total'] > 500返回的是布尔型Series(每个元素对应是否满足Total>500),把它放进列表里判断时,这个条件永远为真,导致循环每一行都被添加到Total列表,自然包含所有元素。 - 遍历对象错误:你遍历的是整个原始df,而非已经筛选出的传奇宝可梦子集
Leg,逻辑偏离需求。 - 变量名冲突:先通过
plt.subplots定义了子图变量Normal,后面又把同名变量赋值为普通宝可梦的DataFrame,会导致子图引用被覆盖,后续无法用该子图绘图。
修正方案(推荐用Pandas向量操作,高效简洁)
直接通过布尔索引筛选符合条件的记录,再提取列转成列表,无需循环:
from matplotlib import pyplot as plt import pandas as pd plt.style.use('ggplot') df = pd.read_csv('C:/Users/Gemxs/Documents/Python/Pandas/pokemon.csv') # 子图变量改名,避免和数据变量冲突 fig1, (ax_legendary, ax_normal) = plt.subplots(nrows=2, ncols=1) # 一步筛选:传奇宝可梦 + Total>500,提取Total列转列表 Total = df[(df['Legendary'] == True) & (df['Total'] > 500)]['Total'].tolist() print(Total)
如果非要用循环实现
遍历筛选后的传奇宝可梦子集,判断单条记录的Total值:
from matplotlib import pyplot as plt import pandas as pd plt.style.use('ggplot') df = pd.read_csv('C:/Users/Gemxs/Documents/Python/Pandas/pokemon.csv') fig1, (ax_legendary, ax_normal) = plt.subplots(nrows=2, ncols=1) Total = [] gen = [] # 筛选传奇宝可梦子集 Leg = df[df['Legendary'] == True] # 遍历子集,判断单条记录的Total值 for index, row in Leg.iterrows(): if row['Total'] > 500: Total.append(row['Total']) print(Total)
额外提示
- Pandas的向量操作比
iterrows循环高效得多,数据量大时差距明显,优先用向量操作。 - 变量命名要避免冲突,子图变量和数据变量尽量用不同名称,比如子图变量用
ax_xxx的形式。
内容的提问来源于stack exchange,提问作者Gemxs
相关产品推荐
相关产品推荐

