Maison > développement back-end > Tutoriel Python > Quelques conseils pour implémenter la conversion de type de données dans Pandas

Quelques conseils pour implémenter la conversion de type de données dans Pandas

不言
Libérer: 2018-05-07 11:44:00
original
7543 Les gens l'ont consulté

Cet article présente principalement quelques techniques de conversion de types de données dans Pandas, qui ont une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Avant-propos <.>

Pandas est un outil d'analyse de données important en Python. Lorsque vous utilisez Pandas pour l'analyse de données, il est très important de s'assurer que le type de données correct est utilisé, sinon des erreurs imprévisibles peuvent se produire.

Types de données dans Pandas : les types de données sont essentiellement les structures internes que les langages de programmation utilisent pour comprendre comment stocker et manipuler les données. Par exemple, un programme doit comprendre que l’on peut additionner deux nombres, comme 5 + 10, pour obtenir 15. Ou, s'il s'agit de deux chaînes, telles que "cat" et "hat", vous pouvez les concaténer (ajouter) pour obtenir "cathat". Le professeur Chen, programmeur à Shangxuetang·Baizhan, a souligné qu'une chose potentiellement déroutante à propos des types de données Pandas est qu'il existe un certain chevauchement entre les types de données Pandas, Python et numpy.


La plupart du temps, vous n'avez pas à vous soucier de savoir si vous devez explicitement convertir un type pandas en type NumPy correspondant. De manière générale, vous pouvez utiliser int64 et float64 par défaut de Pandas. La seule raison pour laquelle j'inclus ce tableau est que vous pouvez parfois voir des types Numpy entre les lignes de code ou lors de votre propre analyse.

Les types de données font partie de ces choses dont vous ne vous souciez pas jusqu'à ce que vous rencontriez une erreur ou un résultat inattendu. Mais c'est aussi la première chose que vous devez vérifier lors du chargement de nouvelles données dans Pandas pour une analyse plus approfondie.

L'auteur utilise Pandas depuis un certain temps, mais je fais encore des erreurs sur certains problèmes mineurs. En remontant à la source, j'ai découvert que certaines colonnes de fonctionnalités ne sont pas du type que Pandas peut gérer lorsqu'il fonctionne sur des données. . Par conséquent, cet article abordera quelques conseils sur la façon de convertir les types de données de base de Python en types de données que Pandas peut gérer.

Types de données pris en charge respectivement par Pandas, Numpy et Python


D'après le tableau ci-dessus On peut voir que Pandas prend en charge les types de données les plus abondants. Dans certains cas, les types de données Numpy peuvent être convertis en types de données Pandas. Après tout, la bibliothèque Pandas est développée sur la base de Numpy.


Présentation des données réelles pour l'analyse

Le type de données est quelque chose dont vous ne vous souciez peut-être pas beaucoup jusqu'à ce que vous obteniez un mauvais résultat, donc dans Un exemple de l'analyse des données réelles est introduite ici pour approfondir la compréhension.

import numpy as np
import pandas as pd

data = pd.read_csv(&#39;data.csv&#39;, encoding=&#39;gbk&#39;) #因为数据中含有中文数据
data
Copier après la connexion


Les données sont chargées maintenant, Si vous souhaitez effectuer certaines opérations sur les données maintenant, tels que Ajouter les éléments correspondants des colonnes de données 2016 et 2017.

données['2016'] + données['2017'] #Pris pour acquis



À en juger par les résultats, il n'y a pas d'ajout correspondant de valeurs numériques comme prévu, car l'ajout de types d'objets dans Pandas équivaut à l'ajout de chaînes en Python.

data.info() #Avant de traiter les données, vous devez vérifier les informations pertinentes des données chargées



Après avoir vu les informations pertinentes sur le chargement des données, vous pouvez rencontrer les problèmes suivants :

  • Le type de données du numéro de client est int64 au lieu du type d'objet

  • Le type de données des colonnes 2016 et 2017 est un objet au lieu d'un type numérique (int64, float64)

  • Le type de données du taux de croissance et du groupe doit être type numérique au lieu du type d'objet

  • Les types de données année, mois et jour doivent être de type datetime64 au lieu du type d'objet

Il y en a trois méthodes de base pour la conversion de type de données dans Pandas :

  • Utilisez la fonction astype() pour la conversion de type forcée

  • Fonction personnalisée pour la conversion de type de données

  • Utilisez les fonctions fournies par Pandas telles que to_numeric(), to_datetime()

Utilisez la fonction astype() pour la conversion de type

Le moyen le plus simple de convertir le type de données de la colonne de données est d'utiliser la fonction astype()

data[&#39;客户编号&#39;].astype(&#39;object&#39;)

data[&#39;客户编号&#39;] = data[&#39;客户编号&#39;].astype(&#39;object&#39;) #对原始数据进行转换并覆盖原始数据列
Copier après la connexion

ci-dessus Les résultats semblent très bons. Voici quelques exemples où la fonction astype() fonctionne sur les données de colonne mais échoue

data[&#39;2017&#39;].astype(&#39;float&#39;)
Copier après la connexion
.

data[&#39;所属组&#39;].astype(&#39;int&#39;)
Copier après la connexion


从上面两个例子可以看出,当待转换列中含有不能转换的特殊值时(例子中¥,ErrorValue等)astype()函数将失效。有些时候astype()函数执行成功了也并不一定代表着执行结果符合预期(神坑!)

data[&#39;状态&#39;].astype(&#39;bool&#39;)
Copier après la connexion


乍一看,结果看起来不错,但仔细观察后,会发现一个大问题。那就是所有的值都被替换为True了,但是该列中包含好几个N标志,所以astype()函数在该列也是失效的。

总结一下astype()函数有效的情形:

  • 数据列中的每一个单位都能简单的解释为数字(2, 2.12等)

  • 数据列中的每一个单位都是数值类型且向字符串object类型转换

如果数据中含有缺失值、特殊字符astype()函数可能失效。

使用自定义函数进行数据类型转换

该方法特别适用于待转换数据列的数据较为复杂的情形,可以通过构建一个函数应用于数据列的每一个数据,并将其转换为适合的数据类型。

对于上述数据中的货币,需要将它转换为float类型,因此可以写一个转换函数:

def convert_currency(value):
 """
 转换字符串数字为float类型
 - 移除 ¥ ,
 - 转化为float类型
 """
 new_value = value.replace(&#39;,&#39;, &#39;&#39;).replace(&#39;¥&#39;, &#39;&#39;)
 return np.float(new_value)
Copier après la connexion

现在可以使用Pandas的apply函数通过covert_currency函数应用于2016列中的所有数据中。

data[&#39;2016&#39;].apply(convert_currency)
Copier après la connexion


该列所有的数据都转换成对应的数值类型了,因此可以对该列数据进行常见的数学操作了。如果利用lambda表达式改写一下代码,可能会比较简洁但是对新手不太友好。

data[&#39;2016&#39;].apply(lambda x: x.replace(&#39;¥&#39;, &#39;&#39;).replace(&#39;,&#39;, &#39;&#39;)).astype(&#39;float&#39;)
Copier après la connexion

当函数需要重复应用于多个列时,个人推荐使用第一种方法,先定义函数还有一个好处就是可以搭配read_csv()函数使用(后面介绍)。

#2016、2017列完整的转换代码
data['2016'] = data[&#39;2016&#39;].apply(convert_currency)
data['2017'] = data['2017'].apply(convert_currency)
Copier après la connexion

同样的方法运用于增长率,首先构建自定义函数

def convert_percent(value):
 """
 转换字符串百分数为float类型小数
 - 移除 %
 - 除以100转换为小数
 """
 new_value = value.replace(&#39;%&#39;, &#39;&#39;)
 return float(new_value) / 100
Copier après la connexion

使用Pandas的apply函数通过covert_percent函数应用于增长率列中的所有数据中。

data[&#39;增长率&#39;].apply(convert_percent)
Copier après la connexion

使用lambda表达式:

data[&#39;增长率&#39;].apply(lambda x: x.replace(&#39;%&#39;, &#39;&#39;)).astype(&#39;float&#39;) / 100
Copier après la connexion

结果都相同:


为了转换状态列,可以使用Numpy中的where函数,把值为Y的映射成True,其他值全部映射成False。

data[&#39;状态&#39;] = np.where(data[&#39;状态&#39;] == &#39;Y&#39;, True, False)
Copier après la connexion

同样的你也可以使用自定义函数或者使用lambda表达式,这些方法都可以完美的解决这个问题,这里只是多提供一种思路。

利用Pandas的一些辅助函数进行类型转换

Pandas的astype()函数和复杂的自定函数之间有一个中间段,那就是Pandas的一些辅助函数。这些辅助函数对于某些特定数据类型的转换非常有用(如to_numeric()、to_datetime())。所属组数据列中包含一个非数值,用astype()转换出现了错误,然而用to_numeric()函数处理就优雅很多。

pd.to_numeric(data[&#39;所属组&#39;], errors=&#39;coerce&#39;).fillna(0)
Copier après la connexion


可以看到,非数值被替换成0.0了,当然这个填充值是可以选择的,具体文档见
pandas.to_numeric - pandas 0.22.0 documentation

Pandas中的to_datetime()函数可以把单独的year、month、day三列合并成一个单独的时间戳。

pd.to_datetime(data[[&#39;day&#39;, &#39;month&#39;, &#39;year&#39;]])
Copier après la connexion

完成数据列的替换

data['new_date'] = pd.to_datetime(data[[&#39;day&#39;, &#39;month&#39;, &#39;year&#39;]]) #新产生的一列数据
data['所属组'] = pd.to_numeric(data[&#39;所属组&#39;], errors=&#39;coerce&#39;).fillna(0)
Copier après la connexion

到这里所有的数据列都转换完毕,最终的数据显示:


在读取数据时就对数据类型进行转换,一步到位

data2 = pd.read_csv("data.csv",
   converters={
    &#39;客户编号&#39;: str,
    &#39;2016&#39;: convert_currency,
    &#39;2017&#39;: convert_currency,
    &#39;增长率&#39;: convert_percent,
    &#39;所属组&#39;: lambda x: pd.to_numeric(x, errors=&#39;coerce&#39;),
    &#39;状态&#39;: lambda x: np.where(x == "Y", True, False)
    },
   encoding=&#39;gbk&#39;)
Copier après la connexion

在这里也体现了使用自定义函数比lambda表达式要方便很多。(大部分情况下lambda还是很简洁的,笔者自己也很喜欢使用)

Résumé

La première étape de l'exploitation d'un ensemble de données consiste à s'assurer que le type de données correct est défini, puis les données peuvent être analysé et visualisé Pour d'autres opérations, Pandas propose de nombreuses fonctions très pratiques. Avec ces fonctions, il sera très pratique d'analyser les données.

Recommandations associées :

Pandas implémente la sélection de lignes d'index spécifiques

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal