Как создать новые столбцы, производные от существующих?

In [1]: import pandas as pd
Данные, использованные в этом уроке:
  • В этом руководстве используются данные о концентрации \(NO_2\) в воздухе, предоставленные openaq и использующие пакет py-openaq. Набор данных air_quality_no2.csv содержит значения \(NO_2\) от измерительных станций FR04014, BETR801 и London Westminster в Париже, Антверпене и Лондоне соответственно.

    Исходные данные
    In [2]: air_quality = pd.read_csv("data/air_quality_no2.csv", index_col=0, parse_dates=True)
    
    In [3]: air_quality.head()
    Out[3]: 
                         station_antwerp  station_paris  station_london
    datetime                                                           
    2019-05-07 02:00:00              NaN            NaN            23.0
    2019-05-07 03:00:00             50.5           25.0            19.0
    2019-05-07 04:00:00             45.0           27.7            19.0
    2019-05-07 05:00:00              NaN           50.4            16.0
    2019-05-07 06:00:00              NaN           61.9             NaN
    
../../_images/05_newcolumn_1.svg
  • Я хочу выразить концентрацию \(NO_2\), измеренную на станции в Лондоне, в мг/м\(^3\)

    (При температуре 25 градусов Цельсия и давлении 1013 гПа коэффициент пересчета составит 1,882)

    In [4]: air_quality["london_mg_per_cubic"] = air_quality["station_london"] * 1.882
    
    In [5]: air_quality.head()
    Out[5]: 
                         station_antwerp  station_paris  station_london  london_mg_per_cubic
    datetime                                                                                
    2019-05-07 02:00:00              NaN            NaN            23.0               43.286
    2019-05-07 03:00:00             50.5           25.0            19.0               35.758
    2019-05-07 04:00:00             45.0           27.7            19.0               35.758
    2019-05-07 05:00:00              NaN           50.4            16.0               30.112
    2019-05-07 06:00:00              NaN           61.9             NaN                  NaN
    

    Чтобы создать новый столбец, используйте скобки [] с именем нового столбца в левой части присваивания.

Примечание

Расчет значений выполняется поэлементно. Это означает, что все значения в столбце одновременно умножаются на 1,882. Вам не нужно использовать цикл для повторения операции с каждой из строк!

../../_images/05_newcolumn_2.svg
  • Я хочу проверить соотношение значений в Париже и Антверпене и сохранить результат в новом столбце.

    In [6]: air_quality["ratio_paris_antwerp"] = (
       ...:     air_quality["station_paris"] / air_quality["station_antwerp"]
       ...: )
       ...: 
    
    In [7]: air_quality.head()
    Out[7]: 
                         station_antwerp  station_paris  station_london  london_mg_per_cubic  ratio_paris_antwerp
    datetime                                                                                                     
    2019-05-07 02:00:00              NaN            NaN            23.0               43.286                  NaN
    2019-05-07 03:00:00             50.5           25.0            19.0               35.758             0.495050
    2019-05-07 04:00:00             45.0           27.7            19.0               35.758             0.615556
    2019-05-07 05:00:00              NaN           50.4            16.0               30.112                  NaN
    2019-05-07 06:00:00              NaN           61.9             NaN                  NaN                  NaN
    

    Расчет снова поэлементный, поэтому / применяется для значений в каждой строке.

Другие математические операторы (+, -, \*, /) или логические операторы (<, >, ``= `` и другие) тоже работают поэлементно. Последнее уже использовалось в уроке по подмножеству данных для фильтрации строк таблицы с использованием условного выражения.

Если вам нужна более продвинутая логика, вы можете использовать произвольный код Python через apply().

  • Я хочу переименовать столбцы данных в соответствующие идентификаторы станций, используемые openAQ.

    In [8]: air_quality_renamed = air_quality.rename(
       ...:     columns={
       ...:         "station_antwerp": "BETR801",
       ...:         "station_paris": "FR04014",
       ...:         "station_london": "London Westminster",
       ...:     }
       ...: )
       ...: 
    
    In [9]: air_quality_renamed.head()
    Out[9]: 
                         BETR801  FR04014  London Westminster  london_mg_per_cubic  ratio_paris_antwerp
    datetime                                                                                           
    2019-05-07 02:00:00      NaN      NaN                23.0               43.286                  NaN
    2019-05-07 03:00:00     50.5     25.0                19.0               35.758             0.495050
    2019-05-07 04:00:00     45.0     27.7                19.0               35.758             0.615556
    2019-05-07 05:00:00      NaN     50.4                16.0               30.112                  NaN
    2019-05-07 06:00:00      NaN     61.9                 NaN                  NaN                  NaN
    

    Функцию rename() можно использовать как для меток строк, так и для меток столбцов. Предоставьте словарь с текущими именами в качестве ключей и новыми именами в качестве значений, чтобы обновить соответствующие имена.

Маппинг не обязательно ограничивать только фиксированными именами, можно использовать и функцию. Например, преобразование имен столбцов в строчные буквы можно выполнить с помощью функции:

In [10]: air_quality_renamed = air_quality_renamed.rename(columns=str.lower)

In [11]: air_quality_renamed.head()
Out[11]: 
                     betr801  fr04014  london westminster  london_mg_per_cubic  ratio_paris_antwerp
datetime                                                                                           
2019-05-07 02:00:00      NaN      NaN                23.0               43.286                  NaN
2019-05-07 03:00:00     50.5     25.0                19.0               35.758             0.495050
2019-05-07 04:00:00     45.0     27.7                19.0               35.758             0.615556
2019-05-07 05:00:00      NaN     50.4                16.0               30.112                  NaN
2019-05-07 06:00:00      NaN     61.9                 NaN                  NaN                  NaN
В руководстве пользователя

Подробная информация о переименовании меток столбцов или строк приведена в разделе руководства пользователя о переименовании меток.

ЗАПОМНИТЕ

  • Создавайте новый столбец, записывая результат в DataFrame с новым именем столбца между квадратными скобками [].

  • Операции выполняются поэлементно, не нужно перебирать строки.

  • Используйте rename со словарем или функцией, чтобы переименовать метки строк или имена столбцов.

В руководстве пользователя

Руководство пользователя содержит отдельный раздел о добавлении и удалении столбцов.