2015-06-05 3 views
13

У меня есть dataframe как этотПанды сравнить следующий ряд

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. является т больше в следующем строка и
  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 
+0

Вы не указали, что делать, когда ваши условия «Истинные», также укажите желаемый df, чтобы избежать двусмысленности. – EdChum

+0

Также в вашем примере df нет строк, где столбец «z» совпадает с следующей строкой – EdChum

+0

обновил исходное сообщение – NinjaGaiden

ответ

12

Похоже, вы хотите использовать метод 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 

Если я неправильно понял ваш запрос, пожалуйста, отправьте комментарий, и я обновлю свой ответ.

+3

'shift (1)' сравнивает предыдущую строку, следующая строка будет 'shift (-1)' – EdChum

+0

@EdChum Thnx m8. Наверное, я отвечал немного быстро. – firelynx

+0

Да, похоже похоже. Столбец z является строкой, как сравнить ее с следующей строкой? Мне не удалось заставить его работать со сдвигом() – NinjaGaiden

Смежные вопросы