【问题标题】:How to use join method in pandas dataframe如何在熊猫数据框中使用连接方法
【发布时间】:2020-06-25 10:32:41
【问题描述】:

我有这行代码,它获取前一天的最后一个值并将其重复添加到第二天的新列中。工作正常。

df = df.join(df.resample('B', on='Date')['x'].last().rename('xnew'), on=pd.to_datetime((df['Date'] - pd.tseries.offsets.BusinessDay()).dt.date))

现在我需要类似的东西,但我无法让它工作。
我现在需要“打开”中当天的第一个值,并将该值复制到新列“打开”中的每一行中,每一天
我试过了,但它不起作用:

df = df.join(df.resample('B', on='Date')['Open'].last().rename('opening'), on=pd.to_datetime((df['Date'])))

错误:

ValueError: columns overlap but no suffix specified: Index(['opening'], dtype='object')

我怎样才能做到这一点?

与:

opening = df.resample('B', on='Date')['Open'].first()

Date
2019-06-20    2927.25
2019-06-21    2932.75
2019-06-24    2942.00
2019-06-25    2925.00
2019-06-26    2902.75
               ...   
2020-06-17    3116.50
2020-06-18    3091.50
2020-06-19    3101.75
2020-06-22    3072.75
2020-06-23    3111.25

..我得到第一个值,我想要的输出是

        Date                 Open       opening
1       2020-06-24 07:00:00  3091.50    3111.25  
2       2020-06-24 07:05:00  3092.50    3111.25
3       2020-06-24 07:10:00  3090.25    3111.25
4       2020-06-24 07:15:00  3089.75    3111.25

这是一些示例数据。对于此示例,时间现在是从 7:00 到 7:15:

           Time             Open
Date        
2019-06-20 07:00:00 70000   2927.25
2019-06-20 07:05:00 70500   2927.00
2019-06-20 07:10:00 71000   2927.00
2019-06-20 07:15:00 71500   2926.75
2019-06-21 07:00:00 70000   2932.75
2019-06-21 07:05:00 70500   2932.25
2019-06-21 07:10:00 71000   2933.00
2019-06-21 07:15:00 71500   2930.75
2019-06-24 07:00:00 70000   2942.00
2019-06-24 07:05:00 70500   2941.50
2019-06-24 07:10:00 71000   2942.00
2019-06-24 07:15:00 71500   2941.50
2019-06-25 07:00:00 70000   2925.00
2019-06-25 07:05:00 70500   2925.75
2019-06-25 07:10:00 71000   2926.50
2019-06-25 07:15:00 71500   2926.00
2019-06-26 07:00:00 70000   2902.75
2019-06-26 07:05:00 70500   2903.00
2019-06-26 07:10:00 71000   2904.00
2019-06-26 07:15:00 71500   2904.25

【问题讨论】:

标签: python pandas


【解决方案1】:

我使用resample 开始使用与您类似的方法。我添加的东西是移动所有值,以便每个值都将第二天作为索引。然后我可以将此值提供给在日期应用的Series.map

代码如下:

df['opening'] = df.Date.dt.date.map(df.resample('B', on='Date').Open.first().shift())
    Date                Open    opening
0   2019-06-20 07:00:00 2927.25 
1   2019-06-20 07:05:00 2927.0  
2   2019-06-20 07:10:00 2927.0  
3   2019-06-20 07:15:00 2926.75 
4   2019-06-21 07:00:00 2932.75 2927.25
5   2019-06-21 07:05:00 2932.25 2927.25
6   2019-06-21 07:10:00 2933.0  2927.25
7   2019-06-21 07:15:00 2930.75 2927.25
8   2019-06-24 07:00:00 2942.0  2932.75
9   2019-06-24 07:05:00 2941.5  2932.75
10  2019-06-24 07:10:00 2942.0  2932.75
11  2019-06-24 07:15:00 2941.5  2932.75
12  2019-06-25 07:00:00 2925.0  2942.0

当然,第一天会有NaN。

【讨论】:

  • 出了点问题。 06-21 天的值应该是 06-20 (7:00h,2927.25)的第一个值,依此类推。 06-24 的值 = 2932.75。看起来您的代码取自 7:15 的最后一个值。第一天 NaN 没问题
  • 确实!我刚刚用first() 替换了last(),它可以工作:)
猜你喜欢
  • 2016-03-09
  • 2021-07-12
  • 1970-01-01
  • 2019-06-26
  • 2018-03-11
  • 2018-01-26
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多