.. _10min_tut_05_columns:
{{ header }}
.. ipython:: python
import pandas as pd
.. raw:: html
-
.. include:: includes/air_quality_no2.rst
.. ipython:: python
air_quality = pd.read_csv("data/air_quality_no2.csv", index_col=0, parse_dates=True)
air_quality.head()
.. raw:: html
How to create new columns derived from existing columns
-------------------------------------------------------
.. image:: ../../_static/schemas/05_newcolumn_1.svg
:align: center
.. raw:: html
-
I want to express the :math:`NO_2` concentration of the station in London in mg/m\ :math:`^3`.
(*If we assume temperature of 25 degrees Celsius and pressure of 1013
hPa, the conversion factor is 1.882*)
.. ipython:: python
air_quality["london_mg_per_cubic"] = air_quality["station_london"] * 1.882
air_quality.head()
To create a new column, use the square brackets ``[]`` with the new column name
at the left side of the assignment.
.. raw:: html
.. note::
The calculation of the values is done **element-wise**. This
means all values in the given column are multiplied by the value 1.882
at once. You do not need to use a loop to iterate each of the rows!
.. image:: ../../_static/schemas/05_newcolumn_2.svg
:align: center
.. raw:: html
-
I want to check the ratio of the values in Paris versus Antwerp and save the result in a new column.
.. ipython:: python
air_quality["ratio_paris_antwerp"] = (
air_quality["station_paris"] / air_quality["station_antwerp"]
)
air_quality.head()
The calculation is again element-wise, so the ``/`` is applied *for the
values in each row*.
.. raw:: html
Other mathematical operators (``+``, ``-``, ``*``, ``/``, …) and logical
operators (``<``, ``>``, ``==``, …) also work element-wise. The latter was already
used in the :ref:`subset data tutorial <10min_tut_03_subset>` to filter
rows of a table using a conditional expression.
If you need more advanced logic, you can use arbitrary Python code via :meth:`~DataFrame.apply`.
.. raw:: html
-
I want to rename the data columns to the corresponding station identifiers used by `OpenAQ `__.
.. ipython:: python
air_quality_renamed = air_quality.rename(
columns={
"station_antwerp": "BETR801",
"station_paris": "FR04014",
"station_london": "London Westminster",
}
)
.. ipython:: python
air_quality_renamed.head()
The :meth:`~DataFrame.rename` function can be used for both row labels and column
labels. Provide a dictionary with the keys the current names and the
values the new names to update the corresponding names.
.. raw:: html
The mapping should not be restricted to fixed names only, but can be a
mapping function as well. For example, converting the column names to
lowercase letters can be done using a function as well:
.. ipython:: python
air_quality_renamed = air_quality_renamed.rename(columns=str.lower)
air_quality_renamed.head()
.. raw:: html
To user guide
Details about column or row label renaming is provided in the user guide section on :ref:`renaming labels `.
.. raw:: html
.. raw:: html
REMEMBER
- Create a new column by assigning the output to the DataFrame with a
new column name in between the ``[]``.
- Operations are element-wise, no need to loop over rows.
- Use ``rename`` with a dictionary or function to rename row labels or
column names.
.. raw:: html
.. raw:: html
To user guide
The user guide contains a separate section on :ref:`column addition and deletion `.
.. raw:: html