Это 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
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методы могут использоваться для выполнения более разумных преобразований типов данных, см.
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или?Приходите посмотреть на демо!