【问题标题】:Perform operations on last iteration values using iterrows使用 iterrows 对最后一次迭代值执行操作
【发布时间】:2018-12-10 16:00:41
【问题描述】:

我有两个数据集。

df

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']

我写了以下代码

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

但我得到了 Quantity 列除以最新 Factor 列值 2.5 的值,但不是最初除以 1.5 的值

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

【问题讨论】:

    标签: python pandas loops iteration


    【解决方案1】:

    这将为您提供您所寻求的:

    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
    

    【讨论】:

    • 哇!非常感谢!我用另一种方法解决了它,重写文件名并通过它读取它,然后计算数量。所以基本上,如果 df2 中存在 n 行,我会写同一个文件 n 次。这是一个如此优化的解决方案,可以节省大量时间。再次感谢您:)
    • 不客气,我试着让它更快,但我不知道在哪里削减代码:)
    • 与我的代码相比,这已经是最快的了 :)
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 2020-03-29
    • 2019-12-30
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2015-05-13
    • 2017-11-19
    相关资源
    最近更新 更多