переносить данные из более ранней части кадра данных в более позднюю часть на основе соответствия критериям - PullRequest
0 голосов
/ 26 апреля 2020

Хорошо, я попытался выяснить это, но я не смог сделать это, и я не смог найти другие вопросы, подобные этому ...

Используя pandas и фрейм данных, мне нужно сопоставлять данные из более ранней части информационного кадра и помещать их в более позднюю часть информационного кадра на основе соответствующего значения. Данные выглядят так:

    nc  Date        oldval      lor
508 508 2019-07-08  296.820007  500
509 509 2019-07-17  297.73999   502
510 510 2019-07-19  297.170013  502
511 511 2019-07-25  300         504
512 512 2019-08-05  283.820007  505
513 513 2019-08-12  288.070007  506
514 514 2019-08-14  283.899994  506
515 515 2019-08-23  284.850006  507
516 516 2019-09-03  290.73999   508
517 517 2019-09-16  300.160004  510
518 518 2019-09-24  295.869995  511
519 519 2019-09-27  295.399994  511
520 520 2019-10-02  288.059998  512
521 521 2019-10-08  288.529999  513
522 522 2019-10-18  297.970001  514
523 523 2019-11-21  310.269989  518
524 524 2019-12-03  309.549988  520

Что мне нужно сделать, это посмотреть на столбец 'lor', сравнить его со всеми предыдущими строками в столбце 'n c' и, если 'n c 'имеет соответствующее значение, затем поместите дату в новый столбец «xDate», а «oldval» - в новый столбец «xval» в той же строке, что и «lor». Числа в столбце 'n c' будут уникальными и будут увеличиваться по значению, в то время как числа в столбце 'lor' могут или не могут дублироваться.

Окончательные данные должны выглядеть следующим образом:

    nc  Date        oldval      lor xdate       xval
508 508 2019-07-08  296.820007  500 np.nan      np.nan
509 509 2019-07-17  297.73999   502 np.nan      np.nan
510 510 2019-07-19  297.170013  502 np.nan      np.nan
511 511 2019-07-25  300         504 np.nan      np.nan
512 512 2019-08-05  283.820007  505 np.nan      np.nan
513 513 2019-08-12  288.070007  506 np.nan      np.nan
514 514 2019-08-14  283.899994  506 np.nan      np.nan
515 515 2019-08-23  284.850006  507 np.nan      np.nan
516 516 2019-09-03  290.73999   508 2019-07-08  296.820007
517 517 2019-09-16  300.160004  510 2019-07-19  297.170013
518 518 2019-09-24  295.869995  511 2019-07-25  300
519 519 2019-09-27  295.399994  511 2019-07-25  300
520 520 2019-10-02  288.059998  512 2019-08-05  283.820007
521 521 2019-10-08  288.529999  513 2019-08-12  288.070007
522 522 2019-10-18  297.970001  514 2019-08-14  283.899994
523 523 2019-11-21  310.269989  518 2019-09-24  295.869995
524 524 2019-12-03  309.549988  520 2019-10-02  288.059998

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Pandas ' слияние может помочь при встрече с вашим вариантом использования:

#reset index
#initialize index to 0, 1, ...
df = df.reset_index(drop=True)

#merge dataframe on itself
res = (df[['lor','Date','oldval']]
       .merge(df, left_on='lor',right_on='nc',how='left')
       .filter(['Date_y','oldval_y'])
       .set_axis(['xdate','xval'],axis=1)
      )

#concatenate df, res on columns
pd.concat([df,res],axis=1)

    nc  Date         oldval     lor xdate    xval
0   508 2019-07-08  296.820007  500 NaN       NaN
1   509 2019-07-17  297.739990  502 NaN       NaN
2   510 2019-07-19  297.170013  502 NaN       NaN
3   511 2019-07-25  300.000000  504 NaN       NaN
4   512 2019-08-05  283.820007  505 NaN       NaN
5   513 2019-08-12  288.070007  506 NaN       NaN
6   514 2019-08-14  283.899994  506 NaN       NaN
7   515 2019-08-23  284.850006  507 NaN       NaN
8   516 2019-09-03  290.739990  508 2019-07-08  296.820007
9   517 2019-09-16  300.160004  510 2019-07-19  297.170013
10  518 2019-09-24  295.869995  511 2019-07-25  300.000000
11  519 2019-09-27  295.399994  511 2019-07-25  300.000000
12  520 2019-10-02  288.059998  512 2019-08-05  283.820007
13  521 2019-10-08  288.529999  513 2019-08-12  288.070007
14  522 2019-10-18  297.970001  514 2019-08-14  283.899994
15  523 2019-11-21  310.269989  518 2019-09-24  295.869995
16  524 2019-12-03  309.549988  520 2019-10-02  288.059998
0 голосов
/ 26 апреля 2020

Вы можете использовать apply, чтобы найти совпадающие значения, а затем преобразовать их в столбцы с помощью apply(pd.Series).

s = df['lor'].apply(lambda x: df.loc[df['nc'] == x, ['Date', 'oldval']].values).explode()  

df[['xdate','xval']] = s.apply(pd.Series) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...