使用iterrows对最后一次迭代的值执行操作

2024-10-16 17:21:34 发布

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

我有两个数据集。你知道吗

测向

Name     Date        Quantity
ZMTD    2018-06-30     1000
ZMTD    2018-05-31     975
ZMTD    2018-04-30     920
ZMTD    2018-03-30     900
ZMTD    2018-02-28     840
ZMTD    2018-01-31     820
ZMTD    2017-12-30     760
ZMTD    2017-11-31     600
ZMTD    2017-10-30     1200
ZMTD    2017-09-31     1170
ZMTD    2017-08-30     1090
ZMTD    2017-07-30     1100

df2型

Name     Date        Factor
KOC    2018-01-15     0.5
ZMTD   2017-11-10     1.5
ZMTD   2018-03-20     2.5 
BND    2016-03-20     25

我试图将满足条件df['Date']<;df2['Date']的所有行上df中的'Quantity'列与df2中的'Factor'列分开。你知道吗

我写了以下代码

name = df['Name'].iloc[0]
for i, row in df2.iterrows():
    if row[0] == name:
        factor_date = row[1]
        ratio = row[2]
        for j, rows in df.iterrows():
            new_quantity = rows[2]
            if (rows[1] < factor_date):
                new_quantity = (new_quantity / ratio)
                df.at[i, 'Quantity'] = new_quantity

当我运行这段代码时,我期望以下值

Name     Date        Quantity
ZMTD    2018-06-30     1000
ZMTD    2018-05-31      975   
ZMTD    2018-04-30      920
ZMTD    2018-03-30      900
ZMTD    2018-02-28      336
ZMTD    2018-01-31      328
ZMTD    2017-12-30      304
ZMTD    2017-11-31      240
ZMTD    2017-10-30      320
ZMTD    2017-09-31      312
ZMTD    2017-08-30      290.66
ZMTD    2017-07-30      293.34

但我得到的值是数量列除以最新的因子列值2.5,而不是最初除以1.5的值

我想知道我们是否可以保存初始迭代的值,然后使用iterrows在以前的值上运行新的迭代。你知道吗


Tags: 代码namedfnewfordatequantityrows
1条回答
网友
1楼 · 发布于 2024-10-16 17:21:34

这会给你你想要的:

df = df1.merge(df2, on='Name', how='left', suffixes=('', '2'))

df['Factor'] = ((df['Date'] < df['Date2']).astype(int) * df['Factor']).replace(0, 1)

df = df.groupby(['Name', 'Date']).agg({'Quantity': 'max', 'Factor': 'prod'}).reset_index()

df['Quantity'] = df['Quantity'] / df['Factor']

df[['Name', 'Date', 'Quantity']].sort_values(['Name', 'Date'], ascending=False).reset_index(drop=True)

#    Name        Date     Quantity
#0   ZMTD  2018-06-30  1000.000000
#1   ZMTD  2018-05-31   975.000000
#2   ZMTD  2018-04-30   920.000000
#3   ZMTD  2018-03-30   900.000000
#4   ZMTD  2018-02-28   336.000000
#5   ZMTD  2018-01-31   328.000000
#6   ZMTD  2017-12-30   304.000000
#7   ZMTD  2017-11-31   240.000000
#8   ZMTD  2017-10-30   320.000000
#9   ZMTD  2017-09-31   312.000000
#10  ZMTD  2017-08-30   290.666667
#11  ZMTD  2017-07-30   293.333333

相关问题 更多 >