Pandas:使用其他行的值创建新列

2024-04-27 04:32:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力做到以下几点: 假设如下:

id, date, value
1, 2017-01-01, 0.245
1, 2017-01-02, 0.445
1, 2017-01-03, 0.235
...
1, 2017-02-01, 0.148
1, 2017-02-02, 0.985
1, 2017-02-03, 0.785
...
1, 2017-03-01, 0.258
1, 2017-03-02, 0.158
1, 2017-03-03, 0.157
...
1, 2017-04-01, 0.7758
1, 2017-04-02, 0.458
1, 2017-04-03, 0.357
...

我试图计算一个新的价值观(让它命名为'outval')的基础上,同一天的值x个月前乘以乘数。(如果前一天是周末,则使用上周五)

下面的代码似乎可以工作,但有点慢。你知道吗

weight_vector = [1,2,3]
ds['outval'] = np.nan
for row in ds.itertuples():
    d_vals = [row.date - pd.DateOffset(months = i) for i in weight_vector]
    d_vals = [x - pd.DateOffset(days = 2) if x.dayofweek == 6 else x for x in d_vals]
    d_vals = [x - pd.DateOffset(days = 1) if x.dayofweek == 5 else x for x in d_vals]
    df = ds.loc[ds['date'].isin(d_vals)]
    if not df.empty and df.shape[0] == len(weight_vector):
        ds['outval'].loc[row.Index] = (weight_vector * df['value']).sum()

一个想法是添加带有x个月前同一天的值的列 i、 e

id, date, value,value-1, value-2, value-3
1, 2017-01-01, 0.245, nan, nan, nan
1, 2017-01-02, 0.445, nan, nan, nan
1, 2017-01-03, 0.235, nan, nan, nan
...
1, 2017-02-01, 0.148, 0.245, nan, nan
1, 2017-02-02, 0.985, 0.445, nan, nan
1, 2017-02-03, 0.785, 0.235, nan, nan
...
1, 2017-03-01, 0.258, 0.148, 0.245, nan
1, 2017-03-02, 0.158, 0.985, 0.445, nan
1, 2017-03-03, 0.157, 0.785, 0.235, nan
...
1, 2017-04-01, 0.7758, 0.258, 0.148, 0.245
1, 2017-04-02, 0.458, 0.158, 0.985, 0.445
1, 2017-04-03, 0.357, 0.157, 0.785, 0.235
...

然后把这些列(或类似的东西)相加/相乘

ds['outval'] = ds['value-1'] * weight_vector[0] + ds['value-2'] * weight_vector[1] + ds['value-3'] * weight_vector[2] +

但是我在创建新列时遇到了问题(shift无法工作,因为可能会丢失日期)

关于如何做到这一点有什么想法,或者有没有其他提高绩效的建议?你知道吗

谢谢!你知道吗


Tags: indffordateifvaluedsnan
1条回答
网友
1楼 · 发布于 2024-04-27 04:32:03

您可以执行以下几个步骤:

  1. 使用apply创建包含正确日期的过去日期列(同一天x个月前,而不是周末)。我们把它们叫做abc。例如:

    from datetime import date
    df = [{"date": date(2018, 1, 2), "value": 1}, {"date": date(2018, 2, 5), "value": 3}]
    df = pd.DataFrame(df)
    
    from functools import partial
    
    def get_date(cur_date, n_month_back):
        dt = cur_date - pd.DateOffset(months=n_month_back)
        dt -= pd.DateOffset(days=max(0, dt.dayofweek - 4))
        return dt
    
    df["a"] = df["date"].apply(partial(get_date, n_month_back=1))
    
  2. date列转换为索引列

  3. 现在您可以找到与abc相关的值(fast)
  4. 使用找到的值计算outval

相关问题 更多 >