【问题标题】:Assign first value in the day to the rest of the rows for that day using Pandas使用 Pandas 将当天的第一个值分配给当天的其余行
【发布时间】:2018-06-09 23:59:26
【问题描述】:

请,我有一个熊猫数据框,其中包含 2 只股票的盘中数据。 该指数是按分钟采样的时间序列(即 2017 年 1 月 1 日 9:30、2017 年 1 月 1 日 9:31、2017 年 1 月 1 日 9:32,...)。 只有两列“价格 A”、“价格 B”。 总行数 = 52000。 我需要创建一个新列,在其中存储每天上午 9.30 的值。 假设 2017 年 1 月 1 日,上午 9:30 的“价格 A”为 150,我需要将此值存储在一个名为“Open A”的新列中,用于同一天的每一行。 例如:

示例输入:

                     Price A  Price B
date                                 
2017-01-01 09:30:00      150        1
2017-01-01 09:31:00      153        2
2017-01-01 09:31:00      149        3
2017-01-01 09:31:00      151        4
2017-02-01 09:30:00      145        1
2017-02-01 09:31:00      139        2
2017-02-01 09:31:00      142        3
2017-02-01 09:31:00      149        4

我尝试简单地使用:

对于 df.index 中的 ind: df['Open A'][ind] = 2

只是为了进行测试,但这似乎需要很长时间。 我还尝试阅读此处可用的内容: How to iterate over rows in a DataFrame in Pandas? 但这似乎没有帮助。 有人有建议吗? 谢谢

【问题讨论】:

  • 我不是 100% 肯定我会跟随。但是,您可能需要df.groupby(pd.Grouper(freq='1D'))['Price A'].transform('first')
  • 你介意把这张图片转换成一些我可以复制并在终端中运行的文本来为你提供答案吗?这将对每个人都有帮助。
  • 你在DataFrame中的索引真的准确吗?您在那里显示的数据似乎有多年的17217...(更不用说它似乎实际上没有被采样(重复分钟发生)) - 如果那是源数据(可能在 Excel 中) - 你真的应该在代码块中发布你的实际 DataFrame 和可重现的示例,而不是作为图像......
  • @cᴏʟᴅsᴘᴇᴇᴅ - 大家好,我真诚而认真地道歉,我打算学习如何清楚地上传我的数据。为了回答您的问题,我确实有一个完美的采样数据,其频率为分钟级别,并且 9:30 确实是每天的第一个值(行)。请问.transform的逻辑?
  • 它的工作原理是,它计算每个组的输出,然后复制每个值,使结果与原始数据帧的长度相同。

标签: python pandas dataframe


【解决方案1】:

如果需要,请将您的索引设置为datetime -

df.index = pd.to_datetime(df.index, errors='coerce')

df

                     Price A  Price B
date                                 
2017-01-01 09:30:00      150        1
2017-01-01 09:31:00      153        2
2017-01-01 09:31:00      149        3
2017-01-01 09:31:00      151        4
2017-02-01 09:30:00      145        1
2017-02-01 09:31:00      139        2
2017-02-01 09:31:00      142        3
2017-02-01 09:31:00      149        4

这里假设您一天的录音从9:30 开始,这让我们的工作变得非常轻松。

使用groupbypd.Grouper + transform + first -

df['Open A'] = df.groupby(pd.Grouper(freq='1D'))['Price A'].transform('first')    
df

                     Price A  Price B  Open A
date                                         
2017-01-01 09:30:00      150        1     150
2017-01-01 09:31:00      153        2     150
2017-01-01 09:31:00      149        3     150
2017-01-01 09:31:00      151        4     150
2017-02-01 09:30:00      145        1     145
2017-02-01 09:31:00      139        2     145
2017-02-01 09:31:00      142        3     145
2017-02-01 09:31:00      149        4     145

【讨论】:

  • 非常感谢大家迄今为止的所有帮助。拜托,有人能指出我在哪里可以学习如何上传我在这里拥有的代码和当前的熊猫数据框吗?我为上传了一张无用的图片而感到难过。再次感谢,安德里亚
  • @Andrea 我不明白这有多难。 print(df.head(10)) 并将输出粘贴到您的问题中。另外,如果答案有帮助,您会考虑接受吗?单击灰色复选标记并将其切换为绿色。你只能接受一个。
  • @Coldspeed 非常感谢您,您的回答非常完美。只有一件事,“将输出粘贴到您的问题中。”。我试过了,但输出很乱,没有格式化。我认为有一种不同的方法可以做到这一点。
  • @Andrea 粘贴后,突出显示数据并按 ctrl+K。巡回赛中都提到了。
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2016-02-09
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多