Pandas 条件连接和计算

Pandas conditional join and calculation

提问人:billv1179 提问时间:1/25/2023 最后编辑:billv1179 更新时间:1/26/2023 访问量:66

问:

我有两个 Pandas 数据帧,df_stock_prices 和 df_sentiment_mean。

我想做以下事情:

  1. 左连接/合并这两个数据帧为一个数据帧,由日期和代码连接。在df_stock_prices中,ticker 是列名,例如 AAPL。OQ 和 df_sentiment_mean ticker 位于名为 ticker 的列的行中。

  2. 如果df_stock_prices的日期和行情与df_sentiment_mean不匹配,请保持不匹配的df_stock_prices行不按原样(因此左联接)。

  3. 当 Date 和 ticker 都匹配时,将字段相乘;例如,在下面列出的数据帧中,如果df_stock_prices日期是 2021-11-29 和 AAPL 列。OQ 符合 2021-11-29 df_sentiment_mean日期,股票代码为 AAPL。OQ,然后将匹配值相乘,在此示例中为:160.24 * 0.163266。

如果 df_stock_prices 中的日期和代码与df_sentiment_mean中的日期和代码值不匹配,请保持这些值不df_stock_prices。

当前数据帧:

df_stock_prices:


            AAPL.OQ  ABBV.N   ABT.N   ACN.N  ADBE.OQ  AIG.N  AMD.OQ  AMGN.OQ  
Date                                                                           
2021-11-29   160.24  116.89  128.03  365.82   687.49  54.95  161.91   203.47   
2021-11-30   165.30  115.28  125.77  357.40   669.85  52.60  158.37   198.88   
2021-12-01   164.77  115.91  126.74  360.14   657.41  51.72  149.11   200.80   
2021-12-02   163.76  116.87  128.38  365.30   671.88  53.96  150.68   201.17   
2021-12-03   161.84  118.85  130.27  361.42   616.53  53.32  144.01   202.44   
...

df_sentiment_mean:

            ticker      diff
Date                         
2021-11-29  AAPL.OQ  0.163266
2021-11-29   ABBV.N -0.165520
2021-11-29    ABT.N  0.149920
2021-11-29  ADBE.OQ -0.014639
2021-11-29    AIG.N -0.448595
...             ...       ...
2023-01-12    LOW.N  0.008863
2023-01-12    MDT.N  0.498884
2023-01-12     MO.N -0.013428
2023-01-12    NEE.N  0.255223
2023-01-12    NKE.N  0.072752

所需数据帧,部分第一行示例:

df_new:

            AAPL.OQ         ABBV.N      ABT.N        ACN.N     ADBE.OQ       AIG.N  …
Date
2021-11-29  26.16174384    -19.3476328  19.1942576  365.82    -10.06416611  -24.65029525  …
...
Python Pandas DataFrame 数据整理

评论

0赞 Corralien 1/25/2023
你确定 for 和 in 吗?ADBE.OQ = -100.6416611AIG.N = -0.80441305df_new
0赞 billv1179 1/26/2023
谢谢你的收获,我确实手动计算了那些错误。

答:

1赞 Corralien 1/25/2023 #1

您必须重新调整第二个数据帧,然后将两个数据帧相乘。最后,用第一个数据帧的原始值填充 nan:

# df1 = df_stock_prices
# df2 = df_sentiment_mean
df_new = df1.mul(df2.set_index('ticker', append=True)['diff'].unstack('ticker')).fillna(df1)
>>> df1
            AAPL.OQ  ABBV.N   ABT.N   ACN.N  ADBE.OQ  AIG.N
Date                                                       
2021-11-29   160.24  116.89  128.03  365.82   687.49  54.95


>>> df2
             ticker      diff
Date                         
2021-11-29  AAPL.OQ  0.163266
2021-11-29   ABBV.N -0.165520
2021-11-29    ABT.N  0.149920
2021-11-29  ADBE.OQ -0.014639
2021-11-29    AIG.N -0.448595


>>> df_new
              AAPL.OQ     ABBV.N      ABT.N   ACN.N    ADBE.OQ      AIG.N
Date                                                                     
2021-11-29  26.161744 -19.347633  19.194258  365.82 -10.064166 -24.650295

评论

0赞 Corralien 1/26/2023
那么答案能解决你的问题吗?
0赞 billv1179 1/26/2023
这非常接近。它按行给出一个 mul 计算。例如,AAPL.OQ 位于第 1 行,ABBV。N 在第 2 行,依此类推。试图弄清楚如何在每一行中将计算放在一起;你有什么想法吗?另外,有什么方法可以恢复日期吗?
0赞 billv1179 1/26/2023
AAPL的。OQ ABBV.N ABT。N 乙腈。N ADBE。OQ AIG.N AMD.OQ \ 0 26.161677 116.89 128.03 365.82 687.49 54.95 161.91 1 165.3 -19.081192 125.77 357.4 669.85 52.6 158.37 2 164.77 115.91 19.000849 360.14 657.41 51.72 149.11 3 163.76 116.87 128.38 365.3 -9.835502 53.96 150.68 4 161.84 118.85 130.27 361.42 616.53 -23.919105 144.01
0赞 Corralien 1/26/2023
上面的代码逐个元素相乘(日期、代码)。你说的把日期带回来是什么意思?
0赞 billv1179 1/26/2023
使日期与原始价格或计算结果一致。例如,日期将保留在数据帧中(如索引)。ABBV.N 将进行计算并与 ABBV 保持一致。N 的计算。>> df_new AAPL.OQ ABBV.N ABT。N 乙腈。N ADBE。OQ AIG.N 日期 2021-11-29 26.161744 -19.347633 19.194258 365.82 -10.064166 -24.650295 2021-11-30 ....