панды перебирают строки на основе значений столбцов

#pandas #loops

#панды #петли #pandas #циклы

Вопрос:

Я хочу одновременно рассчитать разницу температур между городами. Структура данных выглядит следующим образом:

 dic = {'city':['a','a','a','a','a','b','b','b','b','b'],'week':[1,2,3,4,5,3,4,5,6,7],'temp':[20,21,23,21,25,20,21,24,21,22]}
df = pd.DataFrame(dic)
df
 ------ ------ ------ 
| city | week | temp |
 ------ ------ ------ 
| a    |    1 |   20 |
| a    |    2 |   21 |
| a    |    3 |   23 |
| a    |    4 |   21 |
| a    |    5 |   25 |
| b    |    3 |   20 |
| b    |    4 |   21 |
| b    |    5 |   24 |
| b    |    6 |   21 |
| b    |    7 |   22 |
 ------ ------ ------ 
  

Я хотел бы рассчитать разницу в температуре между городами а и в на 3, 4 и 5 неделе. Окончательная структура данных должна выглядеть следующим образом:

  -------- ------- ------ ------ 
| city_1 | city2 | week | diff |
 -------- ------- ------ ------ 
| a      | b     |    3 |    3 |
| a      | b     |    4 |    0 |
| a      | b     |    5 |    1 |
 -------- ------- ------ ------ 
  

Ответ №1:

Я бы сводил ваши данные, удалял значения NA и выполнял вычитание напрямую. Таким образом, вы можете сохранить исходные температуры, связанные с каждым городом.

 result = (
    df.pivot(index='week', columns='city', values='temp')
      .dropna(how='any', axis='index')
      .assign(diff=lambda df: df['a'] - df['b'])  
)
print(result)
  
 city     a     b  diff
week                  
3     23.0  20.0   3.0
4     21.0  21.0   0.0
5     25.0  24.0   1.0
  

Комментарии:

1. Просто играю с вашим ответом : ( df.pivot(index='week', columns='city', values='temp') .dropna(how='any', axis='index') .assign(diff=lambda df : df.agg(np.subtract.reduce, axis=1)) )

2. @sammywemmy что произойдет с вашей версией, если в ней тоже есть город «C»?

3. он также применяет это. он основан на той же идее, что и reduce в functools. итак, у вас будет df.a - df.b - df.c , поскольку он применяет его по столбцам

4. @sammywemmy так что, вероятно, это не очень хорошая операция для сравнения температур в городах

5. этот вопрос не сравнивает температуры, не так ли? насколько я понимаю, это разница в температурах. сокращение не имело бы значения для сравнений