Это 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
или?
Приходите посмотреть на демо!