为何无法筛选移除最后一行含NaN值的DataFrame?
问题
需求是将所有收盘价高于SMA200的加密货币加入列表,尝试筛选并处理最后一行含NaN值的DataFrame,但if df.iloc[-1:].any(None):语句未达到预期效果。
原代码:
bullish_coins =[] with open('Binance_USDT.csv') as f: for line in f: if "," not in line: continue symbol = line.split(",")[0] strip = line.split(",")[1] bars =binance.fetch_ohlcv(symbol, timeframe =timeframe, limit=limit) df =pd.DataFrame(bars, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms') df["SMA200"] = df['close'].rolling(window=200).mean() if df.iloc[-1:].any(None): print(df) df.dropna(inplace=True) elif int(df['close'][-1:]) >= int(df['SMA200'][-1:]): bullish_coins.append(symbol) else: continue
解决方案
1. 修正NaN判断逻辑
df.iloc[-1:].any(None)是错误用法,pandas中判断是否存在空值需要结合isna()(或isnull())与any():
df.iloc[-1]取DataFrame的最后一行(返回Series)isna()将每个元素转换为布尔值(空值对应True)any()判断该行是否存在至少一个空值
修正后的判断语句:
if df.iloc[-1].isna().any():
2. 调整数值比较逻辑
- 原代码用
int()强制转换收盘价和SMA200会丢失小数精度,直接保留原数值比较即可 df['close'][-1:]返回的是Series对象,用iloc[-1]取标量值更直观,还能避免索引问题
3. 优化后的完整代码
bullish_coins = [] with open('Binance_USDT.csv') as f: for line in f: if "," not in line: continue symbol = line.split(",")[0] # strip变量未使用,可考虑删除 bars = binance.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit) df = pd.DataFrame(bars, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms') df["SMA200"] = df['close'].rolling(window=200).mean() # 检查最后一行是否有NaN if df.iloc[-1].isna().any(): print(df) df.dropna(inplace=True) # 确保处理后还有数据,再进行比较 if not df.empty and df['close'].iloc[-1] >= df['SMA200'].iloc[-1]: bullish_coins.append(symbol)
额外说明:增加not df.empty判断,避免dropna后DataFrame为空导致后续取iloc[-1]报错。
内容的提问来源于stack exchange,提问作者cabecagrande
相关产品推荐
相关产品推荐

