Pandas比较下一行

46
我有一个像这样的数据框:
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以避免歧义。 - EdChum
在您的示例数据框中,也没有任何行的'z'列与下一行相同。 - EdChum
1
更新了原始帖子。 - NinjaGaiden
你的规则和期望输出相矛盾。第0行应该明确为True。你将第1行设置为True,但是第2行具有不同的z和不同的qty,因此第1行应该为False。看起来你没有与下一行进行比较,而是与上一行进行比较。 - firelynx
1个回答

82

看起来你想使用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

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

14
shift(1) 比较前一行,下一行则为 shift(-1) - EdChum
@EdChum 谢谢,伙计。我想我回答得有点快了。 - firelynx
是的,这似乎就是它。列z是一个字符串,我该如何将其与下一行进行比较?我试过使用shift()但无法使其工作。 - NinjaGaiden
@user3589054 Shift是执行此操作的函数,但您没有沿着数据框的y轴进行比较,而是将数据复制到另一列并将其偏移一步,以便可以逐行进行比较。我在答案中添加的示例应该可以更好地解释这一点。 - firelynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接