【问题标题】:How to Calculate change between rows in Pandas Data Frame如何计算 Pandas 数据框中行之间的变化
【发布时间】:2020-05-30 03:05:09
【问题描述】:

假设我有一个每日销售记录列。我想从中创建两个新列。从一个月开始跟踪变化。记录在案的每一天。我将如何在 Pandas 数据框中执行此操作。熊猫新手,卡在这里。 这是一个样本数据集

而我正在寻找的是创建一个新列“从一个月前的变化”, 这将跟踪今天和 30 天前的每日销售额之间的差异。

【问题讨论】:

  • 请提供一些数据,至少是您当前数据框的一些示例,如果可能,您希望实现什么以及到目前为止您尝试了什么。这样我们才能理解问题并帮助您找到解决方案,否则问题本身就太宽泛了
  • 你能定义a month ago,是30天前吗?
  • @Shijith 是的,一个月是 30 天前。
  • 那么 2020 年 3 月 1 日之前的 1 个月是 1 月 31 日,而 4 月 1 日之前的 1 个月是 3 月 2 日?看起来像一个相当不常见的约定......
  • @Celius Stingher 我现在添加了一个示例数据到问题中

标签: python pandas


【解决方案1】:

了解您正在使用的数据肯定会更容易回答这个问题。但是,一种常见的方法是使用Series.shift 操作在pandas 中创建一个新列,方法如下:

import pandas as pd
df = pd.DataFrame({'Col1': [10, 20, 15, 30, 45],
                   'Col2': [13, 23, 18, 33, 48],
                   'Col3': [17, 27, 22, 37, 52]})

df['Col4'] = df.Col1.shift(periods=-3) # reference df.Col1 value from 3 rows back

您可以使用这个新列在此处进行任何算术/算法计算。

【讨论】:

  • 谢谢@Naman 我会试试你的方法。从那时起我就编辑了这个问题。如果它有助于澄清。
【解决方案2】:

你可以使用pandas.DataFrame.diff

df['new_col'] = df.sales.diff(periods=30)

这将找到当前行和上面 30 行的差异(这可能是也可能不是 30 天前)

【讨论】:

    【解决方案3】:

    您可能想为一个月前发明自己的约定,但如果pd.DateOffset(),通用约定已经实现。

    如果你使用它,你可以这样构建一个增量列:

    df['delta'] = df['Daily Sales'] - df.merge(df[['Date', 'Daily Sales']]
                                               .assign(M1 = df['Date']
                                                 + pd.DateOffset(months=1))
                 .drop_duplicates('M1').drop(columns='Date')
                 .rename({'Daily Sales': 'prev'}, axis=1),
             left_on='Date', right_on='M1', how='left')['prev']
    

    上述(魔法)公式的分解为:

    • 仅提取 DateDayly Sailes 列以进行进一步处理
    • Date 列中添加一个月并将其命名为M1
    • 删除由于使用DateOffset而可能在该日期发生的重复项
    • Daily Sales命令重命名为prev
    • 按常见日期(使用M1 列)将其与原始数据框合并
    • 1 个月的差异是原始数据框的 Daily Sailes 列与合并数据框的 prev 列之间的差异。

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 2021-04-16
      相关资源
      最近更新 更多