Skip to main content
 首页 » 编程设计

python之Pandas 数据框中单元格中的条件更改值

2025年05月04日22lonelyxmas

我想将开盘价、最高价和最低价的 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