【问题标题】:Pandas Merge with interpolationPandas 与插值合并
【发布时间】:2020-10-11 05:55:57
【问题描述】:

我有 2 个数据框 df1 和 df2

df1

Date/Time   S
1/1/2012 0:00   7.51
1/1/2012 1:00   7.28
1/1/2012 2:00   6.75
1/1/2012 3:00   15.00
1/1/2012 4:00   8.18
1/1/2012 5:00   0.00
1/1/2012 6:00   5.00

df2

 S  Val
3.00    30
4.00    186
5.00    406
6.00    723
7.00    1169
8.00    1704
9.00    2230
10.00   2520
11.00   2620
12.00   2700

我想用内插值合并两个数据框。

pd.merge(df1, df2, left_on=['S'], right_on=['S'])

例如: df1 'S' 列将是查找值,df2 中的 'S' 列将是lookupRange,而 outputRange 将是 'Val' 列。

低于 3 和高于 12 的值为 0。

输出应该如下所示,我如何在 pandas 中实现这一点?。或 python 中的任何替代解决方案,然后循环非常感谢。

输出

Date/Time   S   Val
1/1/2012 0:00   7.51    1441.9
1/1/2012 1:00   7.28    1318.8
1/1/2012 2:00   6.75    1057.5
1/1/2012 3:00   15.00   0.0
1/1/2012 4:00   8.18    1798.7
1/1/2012 5:00   0.00    0.0
1/1/2012 6:00   5.00    406.00

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    假设df2S列排序,你可以这样做:

    tmp = df1.assign(tmp=df1.S.apply(np.floor)).merge(df2.assign(tmp2=(df2.Val.shift(-1) - df2.Val)), how='outer', left_on='tmp', right_on='S')
    tmp.loc[tmp.Val.isna(), 'S_x'] = 0
    tmp['Val'] = (tmp['S_x'] - tmp['S_y'].fillna(0)) * tmp['tmp2'].fillna(1) + tmp['Val'].fillna(0)
    
    print(tmp[['Date/Time', 'S_x', 'Val']].dropna().sort_values(by='Date/Time').rename(columns={'S_x': 'S'}))
    

    打印:

           Date/Time      S      Val
    0  1/1/2012 0:00   7.51  1441.85
    1  1/1/2012 1:00   7.28  1318.80
    2  1/1/2012 2:00   6.75  1057.50
    3  1/1/2012 3:00  15.00     0.00
    4  1/1/2012 4:00   8.18  1798.68
    5  1/1/2012 5:00   0.00     0.00
    6  1/1/2012 6:00   5.00   406.00
    

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2015-09-12
      • 2023-02-22
      • 2022-11-04
      • 2014-05-05
      • 2023-03-11
      • 2016-04-01
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多