繁体   English   中英

Pandas 通过堆叠列与匹配条件的值来组合数据帧

[英]Pandas combine dataframes by stacking columns with values on matching condition

我想通过以下方式组合数据帧 1 和 2:

  • 日期栏是一键
  • 第二个键是 dataframe 1 的 header ,项目变量为 dataframe 2
  • 在新的 dataframe V1 中,对应于这些键匹配的 dataframe 1 中的值
  • 如果键与 S1 不匹配,S2 和 S3 值为 null(例如第 0 行)
  • 如果键匹配 S1、S2、S3 值,则从 dataframe 2 连接(例如第 1、2 和 3 行)

我尝试了堆叠组合以获得这些结果,但我无法成功,有什么想法吗?

**Dataframe 1**
     Date           C0          C1       C2        C3
0  2021-03-24  2547.502499  220.815585  91.2  10.764182
1  2021-02-01  2147.502499  219.815585  62.2   8.764182

**Dataframe 2**
    Project   Date          S1    S2         S3
0      C1  2021-03-24  151.733282  67.2   1.882302
1      C1  2021-02-01     150.1  60.2     0.812302
2      C2  2021-03-24   15.15005  50.9  25.200000
**Expected Result**
     Date     Project    V1           S1         S2       S3
0  2021-03-24   C0   2547.502499     NaN         NaN      NaN
1  2021-03-24   C1   220.815585   151.733282    67.2   1.882302
2  2021-03-24   C2      62.2       15.15005     50.9  25.200000
3  2021-02-01   C1   219.815585      150.1      60.2   0.812302
...

使用stackmerge

(df1.set_index('Date')
    .stack()
    .reset_index()
    .rename(columns = {'level_1' : 'Project', 0 : 'V1'})
    .merge(df2, on = ['Date','Project'], how = 'left')
)

output:

    Date        Project            V1        S1     S2          S3
--  ----------  ---------  ----------  --------  -----  ----------
 0  2021-03-24  C0         2547.5      nan       nan    nan
 1  2021-03-24  C1          220.816    151.733    67.2    1.8823
 2  2021-03-24  C2           91.2       15.1501   50.9   25.2
 3  2021-03-24  C3           10.7642   nan       nan    nan
 4  2021-02-01  C0         2147.5      nan       nan    nan
 5  2021-02-01  C1          219.816    150.1      60.2    0.812302
 6  2021-02-01  C2           62.2      nan       nan    nan
 7  2021-02-01  C3            8.76418  nan       nan    nan

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM