我有一个数据框
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_1
及 col_2
值并替换中的值 col_3
. 例如,在第4行的 Dataframe 中( idx=4
),我想回到a之前,这样我就有了相同的值 col_1
及 col_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_1
及 col_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天。我认为应该有一个有效的方法来使用 groupby
及 loc
但我想不出来。有没有一个有效的方法来做到这一点?
1条答案
按热度按时间628mspwn1#
有逻辑
groupby
及shift
```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