首页 > 解决方案 > 根据标准匹配将数据从数据帧的早期部分传输到后面的部分

问题描述

好的,我试图解决这个问题,但我做不到,我找不到任何其他类似的问题......

使用 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”列,将其与“nc”列上的所有先前行进行比较,如果“nc”具有匹配值,则将日期放入新列“xDate”和'oldval' 到与 'lor' 位于同一行的新列 'xval' 中。'nc' 列中的数字将是唯一的并且值会增加,而 '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

标签: pythonpandasdataframe

解决方案


您可以使用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) 

推荐阅读