我想将开盘价、最高价和最低价的 NaN 值替换为与收盘价相同。但是,仅当更改为 0.00
下面是我的代码
try:
url = 'https://api.iextrading.com/1.0/stock/AAME/chart/1y'
q_data = pd.read_json(url)
if q_data.change == 0.00:
q_data.open = q_data.close
q_data.high = q_data.close
q_data.low = q_data.close
except Exception:
print "No data"
continue
问题是 try 循环被绕过并转到 except 循环。 如何正确更改数据?
请您参考如下方法:
这是构建逻辑的一种方式。 fillna 没有内置函数依赖于其他列,但您可以通过组合 bool 数组来达到相同的结果:
df = pd.read_json('file.json')
mask = (df['change'] == 0).values
for col in ['open', 'high', 'low']:
col_mask = mask & df[col].isnull().values
df.loc[col_mask, col] = df.loc[col_mask, 'close']
性能基准测试
循环比明显的向量化方法更快。一些 pandas 专家可能能够阐明性能差异。来自@jezrael 的数据。
df = pd.DataFrame({'close':[100] * 6,
'open':[4,5,4,5,np.nan,4],
'high':[np.nan,8,9,4,2,3],
'low':[1,3,5,7,np.nan,np.nan],
'change':[0,3,6,9,0,4]})
df = pd.concat([df]*10000)
def jp(df):
mask = (df['change'] == 0).values
for col in ['open', 'high', 'low']:
col_mask = mask & df[col].isnull().values
df.loc[col_mask, col] = df.loc[col_mask, 'close']
return df
def jez(df):
cols = ['open', 'high', 'low']
m = df[cols].isnull().values & (df['change'] == 0).values[:, None]
df[cols] = df[cols].mask(m, df['close'], axis=0)
return df
%timeit jp(df) # 9.09 ms
%timeit jez(df) # 13.4 ms
