Pandas est une bibliothèque incontournable pour l'analyse de données en Python. Cependant, ce Pandas a un obstacle très élevé pour les débutants ... J'ai également eu beaucoup de problèmes, alors je vais essayer de le remonter à partir de l'essentiel. Je ne suis pas un Pandas avancé moi-même, alors j'apprécierais vos commentaires et vos conseils. De plus, cet article sera composé de trois parties. (Parce que c'est prévu, il y a une grande possibilité que ça change ...)
Commençons (* ^ ▽ ^ *)
Veuillez noter que l'importation des bibliothèques suivantes sera omise dans les futures notations.
import pandas as pd
import numpy as np
Il existe deux types principaux de classe Pandas, Series et DataFrame. Pour expliquer brièvement la différence, Series peut gérer des données unidimensionnelles (vecteur) et DataFrame peut gérer des données bidimensionnelles (matrice). Vérifions d'abord la série. pandas.Series
sr = pd.Series({'taro': 'kyoto', 'jiro': 'osaka', 'saburo': 'nara'})
print(sr.head())
Dans le code ci-dessus, le nom d'attribut du dictionnaire correspond à l'étiquette de ligne (index) de Series, et la valeur du dictionnaire correspond à la valeur de Series.
sr = pd.Series(['kyoto', 'osaka', 'nara'], index=['taro', 'jiro','saburo'] )
print(sr.head())
Vous pouvez définir l'étiquette de ligne (index) comme ci-dessus. Au fait, si vous ne définissez pas le libellé de la ligne, aucune erreur ne se produira, mais si vous ne le définissez pas explicitement, le nombre 0,1 sera défini automatiquement.
La série a encore de nombreuses fonctionnalités, mais nous les omettreons car il existe de nombreux doublons avec le DataFrame. ** Cependant, veuillez noter que DataFrame et Series sont utilisés différemment même s'ils ont le même nom d'attribut. ** ** (Je pense que c'est aussi l'un des facteurs qui rendent les pandas difficiles ...)
En parlant de Pandas, c'est DataFrame. Jetons un œil à la référence officielle de DataFrame. pandas.DataFrame
Les trois suivants sont des arguments importants pour le constructeur de pandas.DataFrame.
Jetons un coup d'œil au programme actuel.
Le premier est le cas de la création de Datarfame à l'aide de données de colonne. Le nom d'attribut du dictionnaire est utilisé comme étiquette de colonne et la valeur (enregistrée sous forme de tableau) est traitée comme ligne (index). (* Une erreur se produira si les valeurs ne sont pas organisées dans un tableau) ↑ Apparemment, si vous définissez correctement l'index, vous n'obtiendrez pas d'erreur même s'il ne s'agit pas d'un tableau. (C'est compliqué ...)
data = {
'name': ['taro', 'jiro', 'saburo'],
'address': ['kyoto', 'osaka', 'nara'],
'birth': ['2020-01-01T12:00:00', '2020-02-11T12:00:00', '2020-03-22T12:00:00']
}
df = pd.DataFrame(data = data)
print(df.head())
Ensuite, créez un Dataframe à l'aide des données de ligne. Aucune erreur ne se produira sans colonnes, mais dans ce cas, les colonnes seront automatiquement étiquetées avec des nombres tels que 0,1.
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, columns = ['name', 'address', 'birth'])
print(df.head())
À propos, si vous souhaitez définir à la fois l'étiquette de ligne (index) et l'étiquette de colonne (colonnes), procédez comme suit. Définissez à la fois l'index et les colonnes.
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
print(df.head())
Je pense qu'il existe de nombreuses possibilités d'extraire des données de colonne spécifiques à partir des données. Dans ce cas, il est plus flexible d'utiliser loc, qui sera décrit plus loin, mais il est également possible de réduire les colonnes en le spécifiant directement dans le Dataframe. ** Vous n'avez pas besoin de vous souvenir de cette méthode au début car loc, qui sera décrite plus tard, est plus sophistiquée (c'est déroutant) **
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, columns = ['name', 'address', 'birth'])
print(df['name'])
Le code ci-dessus extrait la colonne "nom". Vous remarquerez que l'affichage en forme de tableau a changé. En effet, le résultat de l'extraction des colonnes est Series et non Dataframe.
Si vous souhaitez extraire plusieurs colonnes, procédez comme suit.
df[['name', 'address']]
Si vous extrayez plusieurs colonnes, le résultat extrait sera un Dataframe au lieu d'une série.
Les lignes peuvent être extraites ainsi que les colonnes. Utilisez des tranches pour extraire. ** Vous n'avez pas besoin de vous souvenir de cette méthode au début car loc, qui sera décrite plus tard, est plus sophistiquée (c'est déroutant) **
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
print(df['a':'b'])
Dans ce qui précède, la ligne "a" et la ligne "b" sont extraites.
** Contrairement aux colonnes, plusieurs lignes ne peuvent pas être sélectionnées et extraites individuellement. ** **
(Par exemple, vous ne pouvez pas extraire les lignes a et c)
De plus, si vous souhaitez sélectionner uniquement la ligne a, vous devez la spécifier en tranches.
(Par exemple, print (df ['a': 'a'])
ne peut extraire que la ligne a)
df ['a': 'a']
, vous ne pourrez peut-être pas extraire la ligne a? ,à propos de ça.
Dans DataFrame, la spécification de tranche d'étiquette de ligne / étiquette de colonne inclut l'indice de droite (section fermée), mais la tranche de numéro de ligne / numéro de colonne n'inclut pas l'indice de droite (gauche fermée, droite ouverte) comme une tranche normale. section).
(Je suis aussi accro à ça aussi ...)Dataframe possède les attributs suivants.
Tous sont importants, alors regardons-les un par un.
T peut obtenir la matrice transposée. En termes simples, vous pouvez obtenir des données avec des lignes et des colonnes permutées.
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
print(df.T)
En utilisant at et iat, vous pouvez obtenir la valeur de n'importe quelle position dans ** Dataframe. ** ** ** Pour dataframe at et iat, deux arguments sont toujours requis **. (Pour limiter la position à un) La différence entre at et iat est que at spécifie la position par étiquette de ligne et étiquette de colonne, tandis que iat spécifie par numéro de ligne et numéro de colonne.
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
print(df.at['a','address']) # kyoto
Dans le cas du code ci-dessus, puisque la colonne "adresse" de la ligne "a" est spécifiée, kyoto peut être obtenu.
Lors de l'utilisation de iat, ce sera comme suit.
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
print(df.iat[1,2]) #2020-02-11T12:00:00
Puisque la colonne "2" de la ligne "1" est spécifiée, 2020-02-11T12: 00: 00 peut être obtenu. (Le numéro de ligne et le numéro de colonne commencent à 0)
J'expliquerai loc, qui est si fréquent qu'il n'est pas exagéré de dire que c'est le plus important dans Dataframe. Si vous vous souvenez comment utiliser loc, vous pouvez presque gérer le contenu de base. La syntaxe de base de loc est la suivante. ** Lors de l'utilisation de tranches, l'écriture dans un tableau entraînera une erreur. ** **
Dataframe.loc[[<Étiquette de ligne>], [Étiquette de colonne]]
Dataframe.loc[Étiquette de ligne A:Étiquette de ligne B,Étiquette de colonne A:Étiquette de colonne B]
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
#Extraction sur une seule rangée
print(df.loc[['a']])
#Extraction de plusieurs lignes
print(df.loc[['a', 'b']])
#Extraction d'une seule colonne
print(df.loc[:, ['name']])
#Extraction multi-colonnes
print(df.loc[:, ['name', 'address']])
#Extraction de combinaisons de lignes et de colonnes
print(df.loc[['a', 'c'], ['name', 'birth']])
print(df.loc['a':'c', ['name', 'birth']])
Même si les parties étiquette de ligne et étiquette de colonne ne sont pas écrites dans un tableau, une ligne et une colonne peuvent être extraites, mais le comportement est différent de l'extraction d'une ligne et d'une colonne dans le tableau. (Veuillez noter que cette spécification est également une source de confusion ...)
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
#Extraction sur une seule rangée
df.loc[['a']]
type(df.loc[['a']]) # pandas.core.frame.DataFrame
#Extraction sur une seule rangée
df.loc['a']
print(type(df.loc['a'])) # pandas.core.series.Series
#Extraction d'une seule colonne
df.loc[:, ['name']]
print(type(df.loc[:, ['name']])) # pandas.core.frame.DataFrame
#Extraction d'une seule colonne
df.loc[:, 'name']
print(type(df.loc[:, 'name'])) # pandas.core.series.Series
Comme le code ci-dessus, si vous le spécifiez avec un tableau, Dataframe sera retourné, et si vous le spécifiez sans tableau, Series sera retourné. (** Soyez prudent lorsque vous utilisez réellement **)
Il existe de nombreuses situations dans lesquelles vous souhaitez vérifier le type d'étiquettes de colonne et d'étiquettes de ligne définies dans le Dataframe. Vous pouvez vérifier la liste des étiquettes de colonne avec des colonnes et des étiquettes de ligne avec index.
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
#Afficher l'étiquette de la colonne
print(df.columns) # Index(['name', 'address', 'birth'], dtype='object')
#Afficher l'étiquette de ligne
print(df.index) # Index(['a', 'b', 'c'], dtype='object')
Il arrive souvent que vous souhaitiez voir combien de lignes et de colonnes de données existent dans un Dataframe. Vous pouvez obtenir le nombre de lignes et de colonnes en utilisant la forme. Le premier taple renvoyé en forme est le nombre de lignes et le second est le nombre de colonnes.
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
#Obtenez le nombre de lignes et de colonnes
print(df.shape) # (3, 3)
DataFrame est fourni avec des informations telles que les étiquettes de ligne et de colonne en plus des valeurs, mais si vous n'avez pas besoin d'informations d'étiquette et uniquement de données, vous pouvez le convertir en un tableau numpy.
data = [
['taro', 'kyoto', '2020-01-01T12:00:00'],
['jiro', 'osaka', '2020-02-11T12:00:00'],
['saburo', 'nara', '2020-03-22T12:00:00']
]
df = pd.DataFrame(data = data, index = ['a', 'b', 'c'], columns = ['name', 'address', 'birth'])
#Obtenez un tableau numpy
print(df.values)
Si vous le convertissez en un tableau numpy, vous pouvez obtenir les données par la méthode d'accélération similaire à un tableau bidimensionnel normal. ** Veuillez noter que la méthode d'extraction des données est différente pour les tableaux DataFrame, Series et numpy. ** ** (C'est aussi une source de confusion ...)
#Les tableaux numpy peuvent accéder aux données tout comme les tableaux à deux dimensions ordinaires
#Extraire la 0ème ligne et la 1ère colonne
print(df.values[0][1]) # kyoto
#Extraire la ligne 0
print(df.values[0])
#Vous pouvez également utiliser des tranches
#Extraire la première ligne
print(df.values[:, 1]) # ['kyoto' 'osaka' 'nara']
Pandas est certes difficile, mais la référence officielle est écrite d'une manière très facile à comprendre, donc je pense que ce n'est pas un obstacle ridicule à comprendre si vous lisez attentivement la référence et poursuivez l'apprentissage. (Peut-être que j'y pense juste, mais ...). En particulier, 10 minutes aux pandas est compact et facile à comprendre, donc le premier Je le recommande vivement comme point de départ.
Je pense que vous avez utilisé l'expression "source de confusion" environ quatre fois dans cet article. Veuillez noter que cette partie est particulièrement compliquée, donc si vous ne la comprenez pas bien, il peut ne pas être possible de gérer lorsque la quantité de données augmente ou lorsque vous combinez des données.
La deuxième partie présentera enfin la méthode Pandas. Il y a tellement de types de méthodes qu'il est difficile d'apprendre, mais je les écrirai aussi facilement que possible, alors merci. (^^ ♪ Puis (^ _-) - ☆
Recommended Posts