Pandas计算的列未针对新动态添加的行进行更新

时间:2018-03-30 13:10:37

标签: python pandas numpy dataframe

我有一个空的pandas数据框,其中包含基于datetimeIndex的预生成索引列。我还有另外两列高低。

我添加第三列和第四列,其值取决于前两列,即高和低

下面给出了代码段

header = ['high', 'low']
idx = pd.date_range("09:00", "18:00", freq="60min")
df = pd.DataFrame([],index=idx,columns=header)
df['mv'] = df['high'].ewm(span=3, min_periods=3,
                          adjust=False, ignore_na=False).mean()
df['sum'] = (df['high'] + df['low'])
df.index.name='date'
df.loc[('2018-03-30 09:00:00','high')]  = 106
df.loc[('2018-03-30 09:00:00','low')]  = 100

现在,如果我更新第一列和第二列的值,则第三列和第四列中的值将继续为NaN且不会更新。

如果高低列中的值发生变化,如何确保自动完成此操作?

def calculate_sum(row):
    print row['high'], row['low']
    return row['high'] + row['low']
df['sum'] = df.apply(calculate_sum, axis=1)

根据建议,我将df [' sum']行更改为由函数处理(上面的代码)

我发现当我分配df [' sum']

时,最初会调用该函数

对任何行的df [' high']或df [' low']的任何后续更新都不会触发对该函数的回调。

1 个答案:

答案 0 :(得分:0)

从您的代码中,我将定义一个返回数据框更新副本的函数

def update_df(tbl, dt, h,l):
    df = tbl.copy()
    df.loc[dt,['high','low']] = (h,l)
    df['mv'] = df['high'].ewm(span=3, min_periods=3,
                          adjust=False, ignore_na=False).mean()
    df['sum'] = (df['high'] + df['low'])
    return df

您可以更新数据框:

df = update_df(df, '2018-03-30 12:00:00', 50,20)