【问题标题】:Pandas compare next row熊猫比较下一行
【发布时间】:2015-08-20 19:09:34
【问题描述】:

我有一个这样的数据框

d={}
d['z']=['Q8','Q8','Q7','Q9','Q9']
d['t']=['10:30','10:31','10:38','10:40','10:41']
d['qty']=[20,20,9,12,12]

我想比较第一行和第二行

  1. 与下一行的数量相同并且
  2. 在下一行大于 t 并且
  3. z 值是否与下一行相同

想要的值是

   qty                   t   z  valid
0   20 2015-06-05 10:30:00  Q8  False
1   20 2015-06-05 10:31:00  Q8   True
2    9 2015-06-05 10:38:00  Q7  False
3   12 2015-06-05 10:40:00  Q9  False
4   12 2015-06-05 10:41:00  Q9   True

【问题讨论】:

  • 你没有说明当你的条件是True时该怎么做,也发布你想要的df以避免歧义
  • 同样在您的示例 df 中,没有列“z”与下一行相同的行
  • 更新了原帖
  • 你的规则和你想要的输出冲突。第 0 行显然应该是 True。您已将第 1 行设置为 True,但第 2 行具有不同的 z 和不同的数量,因此第 1 行应为 False。看来您不是在与下一行进行比较,而是与上一行进行比较。

标签: python pandas dataframe time-series


【解决方案1】:

您似乎想使用Series.shift 方法。

使用此方法,您可以生成与原始列偏移的新列。像这样:

df['qty_s'] = df['qty'].shift(-1)
df['t_s'] = df['t'].shift(-1)
df['z_s'] = df['z'].shift(-1)

现在你可以比较这些了:

df['is_something'] = (df['qty'] == df['qty_s']) & (df['t'] < df['t_s']) & (df['z'] == df['z_s'])

下面是一个简化示例,说明 Series.shift 如何将下一行与当前行进行比较:

df = pd.DataFrame({"temp_celcius":pd.np.random.choice(10, 10) + 20}, index=pd.date_range("2015-05-15", "2015-05-24")) 
df
            temp_celcius

2015-05-15            21
2015-05-16            28
2015-05-17            27
2015-05-18            21
2015-05-19            25
2015-05-20            28
2015-05-21            25
2015-05-22            22
2015-05-23            29
2015-05-24            25

df["temp_c_yesterday"] = df["temp_celcius"].shift(1)
df
            temp_celcius  temp_c_yesterday
2015-05-15            21               NaN
2015-05-16            28                21
2015-05-17            27                28
2015-05-18            21                27
2015-05-19            25                21
2015-05-20            28                25
2015-05-21            25                28
2015-05-22            22                25
2015-05-23            29                22
2015-05-24            25                29

df["warmer_than_yesterday"] = df["temp_celcius"] > df["temp_c_yesterday"]
            temp_celcius  temp_c_yesterday warmer_than_yesterday
2015-05-15            21               NaN                 False
2015-05-16            28                21                  True
2015-05-17            27                28                 False
2015-05-18            21                27                 False
2015-05-19            25                21                  True
2015-05-20            28                25                  True
2015-05-21            25                28                 False
2015-05-22            22                25                 False
2015-05-23            29                22                  True
2015-05-24            25                29                 False

如果我误解了您的问题,请发表评论,我会更新我的答案。

【讨论】:

  • shift(1) 比较上一行,下一行是shift(-1)
  • @EdChum Thnx m8。我想我回答得有点快。
  • 是的,好像是这样。 z 列是一个字符串,我如何将它与下一行进行比较?我无法让它与 shift() 一起使用
  • @user3589054 Shift 是执行此操作的函数,但您不是沿数据框的 y 轴进行比较,而是将数据复制到另一列并将其偏移一步,因此您可以进行比较每行。我添加到答案中的示例应该可以更好地解释这一点。
猜你喜欢
  • 2020-11-11
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 2017-10-23
  • 2017-02-28
相关资源
最近更新 更多