使用 pandas 中相应 id 的其他数据帧的值填充列

erk*_*ken 4 python dataframe pandas

我有一个数据框,我必须在其中执行一些操作。我把一切都搞定了,就像这样:

 ID  Value      Date          Date_diff_cumsum     Val     Weight
  1   0.000000 2017-02-13 20:54:00     0.0       0.000000     nan
  1   0.029598 2017-02-13 21:02:00     8.0       0.029598     nan
  1   0.273000 2017-02-13 22:33:00    99.0       0.273000     nan
  1   0.153000 2017-02-13 23:24:00    150.0      0.15300      nan
Run Code Online (Sandbox Code Playgroud)

我有另一个数据集,其中有权重,如下所示:

ID   Value
 1   78.0
 2   75.0
 3   83.0
 4   60.0
Run Code Online (Sandbox Code Playgroud)

我想用每个 ID 的权重的重复来填充原始数据帧的权重列,例如:

 ID  Value      Date          Date_diff_cumsum   Val        Weight
  1   0.000000 2017-02-13 20:54:00     0.0       0.000000     78.0
  1   0.029598 2017-02-13 21:02:00     8.0       0.029598     78.0
  1   0.273000 2017-02-13 22:33:00    99.0       0.273000     78.0
  1   0.153000 2017-02-13 23:24:00    150.0      0.15300      78.0
  ...    ...          ...              ...          ...         ...
  4   ....      .....      ....        ....        ...         60.0
  4   ....      .....      ....        ....        ...         60.0
Run Code Online (Sandbox Code Playgroud)

那是因为我需要用这个公式来计算:

  • 对于每个 ID,(Val*1000)/(weight*Date_diff_cumsum),即:将每个 Val 乘以 1000,然后除以权重乘以 i 和 i-1 时间帧之间的时间差(Date_diff_cumsum)并存储它在数据框中,我可以在其中绘制资源

这是我的代码:

df = df[['ID','Value', 'Date']]
df = df.sort_values(by=['Date'])
df['Date_diff_cumsum'] = df.groupby('ID').Date.diff().dt.seconds / 60.0
df['Date_diff_cumsum'] = 
df.groupby('ID').Date_diff_cumsum.cumsum().fillna(0)
df['TempVal'] = df.groupby('ID')['Value'].transform(lambda x:(x- 
x.iloc[0]*1000))
Run Code Online (Sandbox Code Playgroud)

如何执行将第二个数据帧的重量重复添加到第一个数据帧的操作?有更有效的方法吗?因为我需要以相同的方式计算最终结果,但对于每个 ID,使用 3 个名称不同但值相似的其他数据帧,例如:

score = df1[(Val*1000)/(weight*Date_diff_cumsum)]+ 
df2(Val*1000)/(weight*Date_diff_cumsum)]+...
Run Code Online (Sandbox Code Playgroud)

非常感谢

编辑:现在它正在工作,但是每当我尝试找到最终的数据框时:

score = df1.TempVal + df2.TempVal + df3.TempVal
Run Code Online (Sandbox Code Playgroud)

我得到一个充满 nan 的空数据框。你知道为什么吗?我需要打印每个 ID 的所有 tempVal 并绘制它们

Vai*_*ali 5

您可以使用 map 将值从 df2 映射到权重。由于您已经通过 ID 分组计算了 date_diff_cumsum,因此您可以直接从 df1 计算 tempval,

df1['Weight'] = df1['ID'].map(df2.set_index('ID')['Value'])

df1['TempVal'] = df1['Value']*1000/(df1['Weight'] * df1['Date_diff_cumsum'])

    ID  Value       Date              Date_diff_cumsum  Val       Weight    TempVal
0   1   0.000000    2017-02-13 20:54:00 0.0             0.000000    78.0    NaN
1   1   0.029598    2017-02-13 21:02:00 8.0             0.029598    78.0    0.047433
2   1   0.273000    2017-02-13 22:33:00 99.0            0.273000    78.0    0.035354
3   1   0.153000    2017-02-13 23:24:00 150.0           0.153000    78.0    0.013077
Run Code Online (Sandbox Code Playgroud)