5 приемов для изучения преобразования типов данных Pandas

Python

Это 4-й день моего участия в августовском испытании обновлений.Подробности о событии:Испытание августовского обновления

Всем привет, меня зовут Кай.

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

Сегодня мы разберем общие операции преобразования типов данных, а затем соберем их для экстренных случаев!

содержание:

[toc]

1. Укажите тип данных при загрузке данных

Вообще говоря, чтобы не заморачиваться, я иду прямоpd.DataFrame(data)илиpd.read_xx(filename)Вот и все.

Например:

import pandas as pd

df = pd.read_excel('数据类型转换案例数据.xlsx')
df
нация Популярность счет Тоска
0 Китай 10 10 10.0
1 Америка 6 5.8 7.0
2 Япония 2 1.2 7.0
3 Германия 8 6.8 6.0
4 Соединенное Королевство 7 6.6 nan

мы смотримdtypesАтрибуты

df.dtypes
国家       object
受欢迎度      int64
评分      float64
向往度     float64
dtype: object

можно увидетьнацияполеobjectтип,Популярностьдаintцелочисленный тип,счетиТоскаобаfloatтип с плавающей запятой. Фактически, дляТоскаЧто нам может понадобиться, так этоintцелочисленный тип,нацияполеstringТип строки.

Затем мы можем передавать параметры при загрузке данныхdtypeУкажите тип данных каждого поля.

import pandas as pd

df = pd.read_excel('数据类型转换案例数据.xlsx',
                   dtype={
                       '国家':'string',
                       '向往度':'Int64'
                   }
                  )
df
нация Популярность счет Тоска
0 Китай 10 10 10
1 Америка 6 5.8 7
2 Япония 2 1.2 7
3 Германия 8 6.8 6
4 Соединенное Королевство 7 6.6

Проверьте еще разdtypesАтрибуты

df.dtypes
国家       string
受欢迎度      int64
评分      float64
向往度       Int64
dtype: object

Точно так же при создании данных типа DataFrame вы также можете установить тип данных через параметр dtype (случай установить все поля).

df = pd.DataFrame({'A':[1,2,3,4.],
                   'B':[1,3,5,7]
                  },
                  dtype='float32'
                 )
df.dtypes
A    float32
B    float32
dtype: object

2. astype преобразовать тип данных

Для существующих данных мы часто используемastypeЧтобы преобразовать тип данных, вы можете преобразовать столбец (Series) также может указывать несколько столбцов одновременно.

In [1]: df.受欢迎度.astype('float')
Out[1]: 
0    10.0
1     6.0
2     2.0
3     8.0
4     7.0
Name: 受欢迎度, dtype: float64

In [2]: df.astype({'国家':'string',
                   '向往度':'Int64'})
Out[2]: 
   国家  受欢迎度    评分   向往度
0  中国    10  10.0    10
1  美国     6   5.8     7
2  日本     2   1.2     7
3  德国     8   6.8     6
4  英国     7   6.6  <NA>

3. тип данных преобразования pd.to_xx

pd.to_xx

3.1. pd.to_datetime преобразуется в тип времени

  • Преобразование строки, похожей на дату, в дату
  • Преобразование временной метки в дату и т. д.
  • Числовая строка, преобразованная в дату в соответствии с форматом

Если вы столкнулись с ситуацией, которую невозможно преобразовать, по умолчанию будет сообщено об ошибке, которую можно установить параметрамиerrors='coerce'Установите неконвертируемое значениеNaT.

# 将字符串转化为日期
In [3]: s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])

In [4]: s
Out[4]: 
0    3/11/2000
1    3/12/2000
2    3/13/2000
dtype: object

In [5]: pd.to_datetime(s, infer_datetime_format=True)
Out[5]: 
0   2000-03-11
1   2000-03-12
2   2000-03-13
dtype: datetime64[ns]

# 还可以将时间戳转化为日期
In [6]: s = pd.Series([1490195805, 1590195805, 1690195805])

In [7]: pd.to_datetime(s, unit='s')
Out[7]: 
0   2017-03-22 15:16:45
1   2020-05-23 01:03:25
2   2023-07-24 10:50:05
dtype: datetime64[ns]

In [8]: s = pd.Series([1490195805433502912, 1590195805433502912, 1690195805433502912])

In [9]: pd.to_datetime(s, unit='ns')
Out[9]: 
0   2017-03-22 15:16:45.433502912
1   2020-05-23 01:03:25.433502912
2   2023-07-24 10:50:05.433502912
dtype: datetime64[ns]

# 数字字符串按照format转换为日期
In [10]: s = pd.Series(['20200101', '20200202', '202003'])

In [11]: pd.to_datetime(s, format='%Y%m%d', errors='ignore')
Out[11]: 
0    20200101
1    20200202
2      202003
dtype: object

In [12]: pd.to_datetime(s, format='%Y%m%d', errors='coerce')
Out[12]: 
0   2020-01-01
1   2020-02-02
2          NaT
dtype: datetime64[ns]

Следует отметить, что для преобразования даты вышеуказанных временных меток время начала по умолчанию равно1970-01-01,Для внутреннего времени будет разница в 8 часов., у нас есть следующие способы справиться с этим.

In [13]: s
Out[13]: 
0    1490195805
1    1590195805
2    1690195805
dtype: int64

# 默认情况下 格林威治时间
In [14]: pd.to_datetime(s, unit='s')
Out[14]: 
0   2017-03-22 15:16:45
1   2020-05-23 01:03:25
2   2023-07-24 10:50:05
dtype: datetime64[ns]

# 将起始时间加上 8小时
In [15]: pd.to_datetime(s, unit='s', origin=pd.Timestamp('1970-01-01 08:00:00'))
Out[15]: 
0   2017-03-22 23:16:45
1   2020-05-23 09:03:25
2   2023-07-24 18:50:05
dtype: datetime64[ns]

# 手动 加上 8小时 
In [16]: pd.to_datetime(s, unit='s') + pd.Timedelta(days=8/24)
Out[16]: 
0   2017-03-22 23:16:45
1   2020-05-23 09:03:25
2   2023-07-24 18:50:05
dtype: datetime64[ns]

3.2. pd.to_numeric преобразуется в числовой тип

In [17]: s = pd.Series(['1.0', '2', -3])

In [18]: pd.to_numeric(s)
Out[18]: 
0    1.0
1    2.0
2   -3.0
dtype: float64

In [19]: pd.to_numeric(s, downcast='signed')
Out[19]: 
0    1
1    2
2   -3
dtype: int8

In [20]: s = pd.Series(['apple', '1.0', '2', -3])

In [21]: pd.to_numeric(s, errors='ignore')
Out[21]: 
0    apple
1      1.0
2        2
3       -3
dtype: object

In [22]: pd.to_numeric(s, errors='coerce')
Out[22]: 
0    NaN
1    1.0
2    2.0
3   -3.0
dtype: float64

3.3 pd.to_timedelta преобразуется в тип разницы во времени

Преобразование чисел, строк разницы во времени, таких как и т. д., в типы данных разницы во времени.

In [23]: import numpy as np

In [24]: pd.to_timedelta(np.arange(5), unit='d')
Out[24]: TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq=None)

In [25]: pd.to_timedelta('1 days 06:05:01.00003')
Out[25]: Timedelta('1 days 06:05:01.000030')

In [26]: pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan'])
Out[26]: TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None)

4. Тип данных интеллектуального суждения

convert_dtypesметоды могут использоваться для выполнения более разумных преобразований типов данных, см.

convert_dtypes

5. Фильтрация типов данных

Видя, что в некоторых учебных группах друзья часто спрашивают, как фильтровать поля определенных типов данных, давайте сегодня познакомимся с ними.

PandasПредоставляет функцию для фильтрации по типу данных поляselect_dtypes(), обязательные поля типа данных и поля исключенного типа данных могут быть выбраны с помощью параметров.

Signature: 
df.select_dtypes(include=None, exclude=None) -> 'DataFrame'
Docstring:
Return a subset of the DataFrame's columns based on the column dtypes.

Типы данных следующие:

номер:numberилиint,float

логическое значение:bool

время:datetime64

Разница во времени:timedelta64

категория:category

Нить:string

Объект:object

In [27]: df
Out[27]: 
   国家  受欢迎度    评分   向往度
0  中国    10  10.0  10.0
1  美国     6   5.8   7.0
2  日本     2   1.2   7.0
3  德国     8   6.8   6.0
4  英国     7   6.6   NaN

In [28]: df.dtypes
Out[28]: 
国家       object
受欢迎度      int64
评分      float64
向往度     float64
dtype: object

In [29]: df.select_dtypes(include='int')
Out[29]: 
   受欢迎度
0    10
1     6
2     2
3     8
4     7

In [30]: df.select_dtypes(include='number')
Out[30]: 
   受欢迎度    评分   向往度
0    10  10.0  10.0
1     6   5.8   7.0
2     2   1.2   7.0
3     8   6.8   6.0
4     7   6.6   NaN

In [31]: df.select_dtypes(include=['int','object'])
Out[31]: 
   国家  受欢迎度
0  中国    10
1  美国     6
2  日本     2
3  德国     8
4  英国     7

In [32]: df.select_dtypes(exclude=['object'])
Out[32]: 
   受欢迎度    评分   向往度
0    10  10.0  10.0
1     6   5.8   7.0
2     2   1.2   7.0
3     8   6.8   6.0
4     7   6.6   NaN

Выше приведен весь контент на этот раз. Надеюсь, он будет вам полезен. Если вам это нравится, не забудьте поставить лайк и пролистнуть, чтобы посмотреть!

На самом деле существует больше методов параметров, которые вы можете передатьhelpили?Приходите посмотреть на демо!