k处的同一 Dataframe 中的另一列相乘的有效方法

gkl3eglg  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(239)

我有一个数据框

idx day col_1 col_2 col_3 col_4
 1   1    a    A     4     5
 2   1    b    B     5     8
 3   1    a    B     4     11
 4   2    a    A     3     8 
 5   2    b    B     3     6
 6   2    a    B     4     11
 7   3    b    B     5     1

现在把这些行留给 day=1 ,我想乘 col_3 剩余天数的值 col_4 价值观 day 之前,使两行具有相同的 col_1col_2 值并替换中的值 col_3 . 例如,在第4行的 Dataframe 中( idx=4 ),我想回到a之前,这样我就有了相同的值 col_1col_2 ,这将与 idx=1 . 现在,我替换 col_3 在第4行中,使用(旧值 col_3 在里面 idx=4 )*( col_4 价值 idx=1 ),即 3*5=15 . 我想继续到 Dataframe 的末尾。因此,我的新 Dataframe 将如下所示,

idx day col_1 col_2 col_3 col_4
     1   1    a    A     4     5
     2   1    b    B     5     8
     3   1    a    B     4     11
     4   2    a    A     15    8 
     5   2    b    B     24    6
     6   2    a    B     44    11
     7   3    b    B     30    1

day 我们将有所有的三个组合 col_1col_2 . 我实现这一点的方法是使用这样的for循环,

for i in range(3,data_frame.shape[0]):
    day_ = data_frame['day'].iloc[i]
    col1 = data_frame['col_1'].iloc[i]
    col2 = data_frame['col_2'].iloc[i]
    col3 = data_frame['col_3'].iloc[i]
    f = data_frame.loc[(data_frame['col_1']==col1)&(data_frame['col_2']==col2)&(data_frame['day']==day_-1),'col_4'].values[0]
    data_frame.loc[(data_frame['col_1']==col1)&(data_frame['col_2']==col2)&(data_frame['day']==day_),'col_3']=f*col3

这段代码效率很低,因为我使用的 Dataframe 有数千行和多列,在执行操作之前需要匹配这些行和多列。同样在我的例子中,我应该回到7天,而不是像示例中所示的1天。我认为应该有一个有效的方法来使用 groupbyloc 但我想不出来。有没有一个有效的方法来做到这一点?

628mspwn

628mspwn1#

有逻辑 groupbyshift ```
df['new'] = df.groupby(['col_1','col_2'])['col_4'].shift().fillna(1).mul(df['col_3'])
0 4.0
1 5.0
2 4.0
3 15.0
4 24.0
5 44.0
6 30.0
dtype: float64

相关问题