提问人:billv1179 提问时间:1/25/2023 最后编辑:billv1179 更新时间:1/26/2023 访问量:66
Pandas 条件连接和计算
Pandas conditional join and calculation
问:
我有两个 Pandas 数据帧,df_stock_prices 和 df_sentiment_mean。
我想做以下事情:
左连接/合并这两个数据帧为一个数据帧,由日期和代码连接。在df_stock_prices中,ticker 是列名,例如 AAPL。OQ 和 df_sentiment_mean ticker 位于名为 ticker 的列的行中。
如果df_stock_prices的日期和行情与df_sentiment_mean不匹配,请保持不匹配的df_stock_prices行不按原样(因此左联接)。
当 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 …
...
答:
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 ....
评论
ADBE.OQ = -100.6416611
AIG.N = -0.80441305
df_new