Выполните операции с последними значениями итерации, используя iterrows - PullRequest
0 голосов
/ 02 июля 2018

У меня есть два набора данных.

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 со столбцом «Фактор» в df2 во всех строках, которые удовлетворяют условию 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

Но я получаю значения, при которых столбец Количество делится на последнее значение столбца Фактор 2,5, но не на значения, которые первоначально делятся на 1,5

Мне было интересно, можем ли мы сохранить значения начальной итерации, а затем запустить новую итерацию для предыдущих значений, используя итерроу.

1 Ответ

0 голосов
/ 02 июля 2018

Это даст вам то, что вы ищете:

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
...