#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. этот вопрос не сравнивает температуры, не так ли? насколько я понимаю, это разница в температурах. сокращение не имело бы значения для сравнений