如何管理 pandas 数据中的单位?
How can I manage units in pandas data?
我想弄清楚是否有一种好的方法来管理我的 pandas 数据中的 单位 。例如,我有一个 DataFrame
看起来像这样:
length (m) width (m) thickness (cm)
0 1.2 3.4 5.6
1 7.8 9.0 1.2
2 3.4 5.6 7.8
目前,度量单位以列名编码。缺点包括:
- 列选择很尴尬 --
df['width (m)']
与 df['width']
- 如果我的源数据的单位发生变化,事情可能会中断
如果我想从列名中去除单位,是否有其他地方可以存储信息?
目前没有任何好的方法可以做到这一点,请参阅 github 问题 here 进行一些讨论。
作为快速破解,可以做这样的事情,用单位维护一个单独的字典。
In [3]: units = {}
In [5]: newcols = []
...: for col in df:
...: name, unit = col.split(' ')
...: units[name] = unit
...: newcols.append(name)
In [6]: df.columns = newcols
In [7]: df
Out[7]:
length width thickness
0 1.2 3.4 5.6
1 7.8 9.0 1.2
2 3.4 5.6 7.8
In [8]: units['length']
Out[8]: '(m)'
因为我也在找这个。以下是 pint and the (experimental) pint_pandas 今天的能力:
import pandas as pd
import pint
import pint_pandas
ureg = pint.UnitRegistry()
ureg.Unit.default_format = "~P"
pint_pandas.PintType.ureg.default_format = "~P"
df = pd.DataFrame({
"length": pd.Series([1.2, 7.8, 3.4], dtype="pint[m]"),
"width": pd.Series([3.4, 9.0, 5.6], dtype="pint[m]"),
"thickness": pd.Series([5.6, 1.2, 7.8], dtype="pint[cm]"),
})
print(df.pint.dequantify())
length width thickness
unit m m cm
0 1.2 3.4 5.6
1 7.8 9.0 1.2
2 3.4 5.6 7.8
df['width'] = df['width'].pint.to("inch")
print(df.pint.dequantify())
length width thickness
unit m in cm
0 1.2 133.858268 5.6
1 7.8 354.330709 1.2
2 3.4 220.472441 7.8
给你一些方法:
- pands-units-extension: janpipek/pandas-units-extension: Units extension array for pandas based on astropy
- pint-pandas: hgrecco/pint-pandas: Pandas support for pint
自行扩展 pandas
我想弄清楚是否有一种好的方法来管理我的 pandas 数据中的 单位 。例如,我有一个 DataFrame
看起来像这样:
length (m) width (m) thickness (cm)
0 1.2 3.4 5.6
1 7.8 9.0 1.2
2 3.4 5.6 7.8
目前,度量单位以列名编码。缺点包括:
- 列选择很尴尬 --
df['width (m)']
与df['width']
- 如果我的源数据的单位发生变化,事情可能会中断
如果我想从列名中去除单位,是否有其他地方可以存储信息?
目前没有任何好的方法可以做到这一点,请参阅 github 问题 here 进行一些讨论。
作为快速破解,可以做这样的事情,用单位维护一个单独的字典。
In [3]: units = {}
In [5]: newcols = []
...: for col in df:
...: name, unit = col.split(' ')
...: units[name] = unit
...: newcols.append(name)
In [6]: df.columns = newcols
In [7]: df
Out[7]:
length width thickness
0 1.2 3.4 5.6
1 7.8 9.0 1.2
2 3.4 5.6 7.8
In [8]: units['length']
Out[8]: '(m)'
因为我也在找这个。以下是 pint and the (experimental) pint_pandas 今天的能力:
import pandas as pd
import pint
import pint_pandas
ureg = pint.UnitRegistry()
ureg.Unit.default_format = "~P"
pint_pandas.PintType.ureg.default_format = "~P"
df = pd.DataFrame({
"length": pd.Series([1.2, 7.8, 3.4], dtype="pint[m]"),
"width": pd.Series([3.4, 9.0, 5.6], dtype="pint[m]"),
"thickness": pd.Series([5.6, 1.2, 7.8], dtype="pint[cm]"),
})
print(df.pint.dequantify())
length width thickness
unit m m cm
0 1.2 3.4 5.6
1 7.8 9.0 1.2
2 3.4 5.6 7.8
df['width'] = df['width'].pint.to("inch")
print(df.pint.dequantify())
length width thickness
unit m in cm
0 1.2 133.858268 5.6
1 7.8 354.330709 1.2
2 3.4 220.472441 7.8
给你一些方法:
- pands-units-extension: janpipek/pandas-units-extension: Units extension array for pandas based on astropy
- pint-pandas: hgrecco/pint-pandas: Pandas support for pint