Maison  >  Article  >  développement back-end  >  les bases des pandas

les bases des pandas

巴扎黑
巴扎黑original
2017-06-23 15:54:392336parcourir

Pandas est un package d'analyse de données basé sur Numpy qui contient des structures de données et des outils plus avancés

Semblable à Numpy, dont le cœur est ndarray, pandas s'articule également autour des deux structures de données principales de Series et DataFrame. . Series et DataFrame correspondent respectivement à une séquence unidimensionnelle et à une structure de table bidimensionnelle. La méthode d'importation conventionnelle des pandas est la suivante :

from pandas import Series,DataFrame
import pandas as pd

Séries


Les séries peuvent être considérées comme un dictionnaire ordonné de longueur fixe. Fondamentalement, n'importe quelle donnée unidimensionnelle peut être utilisée pour construire des objets Series :

>>> s = Series([1,2,3.0,'abc'])
>>> s
0      1
1      2
2      3
3    abc
dtype: object

Bien que dtype:object puisse contenir une variété de types de données de base, cela semble toujours affecter les performances, il est donc préférable de le conserver type simple.

L'objet Series contient deux attributs principaux : l'index et les valeurs, qui sont les colonnes de gauche et de droite dans l'exemple ci-dessus. Étant donné que ce qui est transmis au constructeur est une liste, la valeur de l'index est un entier qui augmente à partir de 0. Si une structure de paire clé-valeur de type dictionnaire est transmise, une série correspondant à la valeur de l'index sera générée ou dans ; l'initialisation Lors de l'utilisation de paramètres mot-clés pour spécifier explicitement un objet index :

>>> s = Series(data=[1,3,5,7],index = ['a','b','x','y'])
>>> s
a    1
b    3
x    5
y    7
dtype: int64
>>> s.index
Index(['a', 'b', 'x', 'y'], dtype='object')
>>> s.values
array([1, 3, 5, 7], dtype=int64)

Les éléments de l'objet Series seront construits strictement selon l'index donné, ce qui signifie : si le paramètre data a une valeur-clé paire, alors seule la clé contenue dans l'index sera utilisée et si la clé correspondante est manquante dans les données, la clé sera ajoutée même si une valeur NaN est donnée.

Notez que bien qu'il existe une correspondance entre l'index de la série et les éléments de valeurs, celle-ci est différente du mappage du dictionnaire. L'index et les valeurs sont en fait toujours des tableaux ndarray indépendants, donc les performances des objets Series sont tout à fait correctes. Le plus grand avantage des

Series, une structure de données qui utilise des paires clé-valeur, est que lorsque des opérations arithmétiques sont effectuées entre les séries, les index seront automatiquement alignés.

De plus, l'objet Series et son index contiennent tous deux un attribut name :

>>> s.name = 'a_series'
>>> s.index.name = 'the_index'
>>> s
the_index
a            1
b            3
x            5
y            7
Name: a_series, dtype: int64

DataFrame


DataFrame est a Une structure de données tabulaire qui contient un ensemble de colonnes ordonnées (similaire à un index), et chaque colonne peut être d'un type de valeur différent (contrairement à ndarray, qui ne peut avoir qu'un seul type). Fondamentalement, vous pouvez considérer un DataFrame comme une collection de séries partageant le même index.

La méthode de construction de DataFrame est similaire à Series, sauf qu'elle peut accepter plusieurs sources de données unidimensionnelles en même temps, dont chacune deviendra une colonne distincte :

>>> data = {'state':['Ohino','Ohino','Ohino','Nevada','Nevada'],
        'year':[2000,2001,2002,2001,2002],
        'pop':[1.5,1.7,3.6,2.4,2.9]}
>>> df = DataFrame(data)
>>> df
   pop   state  year
0  1.5   Ohino  2000
1  1.7   Ohino  2001
2  3.6   Ohino  2002
3  2.4  Nevada  2001
4  2.9  Nevada  2002

[5 rows x 3 columns]

Bien que le paramètre data ressemble à un dictionnaire, la clé du dictionnaire ne joue pas le rôle d'index du DataFrame, mais d'attribut "name" de la série. L'index généré ici est toujours "01234".

Les paramètres du constructeur DataFrame les plus complets sont : DataFrame(data=None,index=None,coloumns=None), les colonnes sont "nom" :

>>> df = DataFrame(data,index=['one','two','three','four','five'],
               columns=['year','state','pop','debt'])
>>> df
       year   state  pop debt
one    2000   Ohino  1.5  NaN
two    2001   Ohino  1.7  NaN
three  2002   Ohino  3.6  NaN
four   2001  Nevada  2.4  NaN
five   2002  Nevada  2.9  NaN

[5 rows x 4 columns]

De même, les valeurs manquantes sont remplies avec NaN. Jetez un œil aux index, aux colonnes et aux types d'index :

>>> df.index
Index(['one', 'two', 'three', 'four', 'five'], dtype='object')
>>> df.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
>>> type(df['debt'])
<class &#39;pandas.core.series.Series&#39;>

Les opérations DataFrame orientées ligne et colonne sont fondamentalement équilibrées et toute colonne extraite est une série.

Propriétés des objets


Réindexation

La réindexation des objets Series est implémentée via sa méthode .reindex(index=None,**kwargs). Il y a deux paramètres couramment utilisés dans **kwargs : method=None,fill_value=np.NaN :

ser = Series([4.5,7.2,-5.3,3.6],index=[&#39;d&#39;,&#39;b&#39;,&#39;a&#39;,&#39;c&#39;])
>>> a = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;]
>>> ser.reindex(a)
a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64
>>> ser.reindex(a,fill_value=0)
a   -5.3
b    7.2
c    3.6
d    4.5
e    0.0
dtype: float64
>>> ser.reindex(a,method=&#39;ffill&#39;)
a   -5.3
b    7.2
c    3.6
d    4.5
e    4.5
dtype: float64
>>> ser.reindex(a,fill_value=0,method=&#39;ffill&#39;)
a   -5.3
b    7.2
c    3.6
d    4.5
e    4.5
dtype: float64

.reindex() La méthode renverra un nouvel objet dont l'index suit strictement les paramètres donnés. Le paramètre method:{'backfill', 'bfill', 'pad', 'ffill', None} est utilisé pour. spécifiez le mode d'interpolation (Fill), lorsqu'il n'est pas indiqué, se remplit automatiquement avec fill_value, la valeur par défaut est NaN (ffill = pad, bfill = back fill, fait respectivement référence à la valeur avant ou arrière pendant l'interpolation)

DataFrame La méthode de réindexation d'un objet est : .reindex(index=None,columns=None,**kwargs). Il n'y a qu'un seul paramètre de colonnes facultatif de plus que Series, qui est utilisé pour indexer les colonnes. L'utilisation est similaire à l'exemple ci-dessus, sauf que le paramètre de méthode d'interpolation method ne peut être appliqué qu'aux lignes, c'est-à-dire à l'axe 0.

>>> state = [&#39;Texas&#39;,&#39;Utha&#39;,&#39;California&#39;]
>>> df.reindex(columns=state,method=&#39;ffill&#39;)
    Texas  Utha  California
a      1   NaN           2
c      4   NaN           5  
d      7   NaN           8

[3 rows x 3 columns]
>>> df.reindex(index=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;],columns=state,method=&#39;ffill&#39;)
   Texas  Utha  California
a      1   NaN           2
b      1   NaN           2
c      4   NaN           5
d      7   NaN           8

[4 rows x 3 columns]

Cependant fill_value est toujours valable. Les amis intelligents se sont peut-être déjà demandé si l'interpolation sur les colonnes pouvait être réalisée via df.T.reindex(index,method='**').T. Notez également que lors de l'utilisation de reindex(index,method='**'), l'index doit être monotone, sinon il déclenchera un ValueError: Must be monotonic for forward fill. Par exemple, le dernier appel de l'exemple ci-dessus ne fonctionnera pas si index=['a','b','d','c'] est utilisé.

Supprimer des éléments sur l'axe spécifié

signifie supprimer un élément d'une Series ou une ligne (colonne) d'un DataFrame, via la méthode .drop(labels, axis=0) de l'objet :

>>> ser
d    4.5
b    7.2
a   -5.3
c    3.6
dtype: float64
>>> df
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> ser.drop(&#39;c&#39;)
d    4.5
b    7.2
a   -5.3
dtype: float64
>>> df.drop(&#39;a&#39;)
   Ohio  Texas  California
c     3      4           5
d     6      7           8

[2 rows x 3 columns]
>>> df.drop([&#39;Ohio&#39;,&#39;Texas&#39;],axis=1)
   California
a           2
c           5
d           8

[3 rows x 1 columns]

.drop() Ce qui est renvoyé est un nouvel objet, et le méta-objet ne sera pas modifié.

Indexation et découpage

Tout comme Numpy, pandas prend également en charge l'indexation et le découpage obj[::] et le filtrage via des tableaux booléens.

Cependant, il convient de noter que, comme l'index d'un objet pandas n'est pas limité aux entiers, lors de l'utilisation d'un nombre non entier comme index de tranche, il est inclus en terminal.

>>> foo
a    4.5
b    7.2
c   -5.3
d    3.6
dtype: float64
>>> bar
0    4.5
1    7.2
2   -5.3
3    3.6
dtype: float64
>>> foo[:2]
a    4.5
b    7.2
dtype: float64
>>> bar[:2]
0    4.5
1    7.2
dtype: float64
>>> foo[:&#39;c&#39;]
a    4.5
b    7.2
c   -5.3
dtype: float64

这里 foo 和 bar 只有 index 不同——bar 的 index 是整数序列。可见当使用整数索引切片时,结果与 Python 列表或 Numpy 的默认状况相同;换成 'c' 这样的字符串索引时,结果就包含了这个边界元素。

另外一个特别之处在于 DataFrame 对象的索引方式,因为他有两个轴向(双重索引)。

可以这么理解:DataFrame 对象的标准切片语法为:.ix[::,::]。ix 对象可以接受两套切片,分别为行(axis=0)和列(axis=1)的方向:

>>> df
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> df.ix[:2,:2]
   Ohio  Texas
a     0      1
c     3      4

[2 rows x 2 columns]
>>> df.ix[&#39;a&#39;,&#39;Ohio&#39;]
0

而不使用 ix ,直接切的情况就特殊了:

  • 索引时,选取的是列

  • 切片时,选取的是行

这看起来有点不合逻辑,但作者解释说 “这种语法设定来源于实践”,我们信他。

>>> df[&#39;Ohio&#39;]
a    0
c    3
d    6
Name: Ohio, dtype: int32
>>> df[:&#39;c&#39;]
   Ohio  Texas  California
a     0      1           2
c     3      4           5

[2 rows x 3 columns]
>>> df[:2]
   Ohio  Texas  California
a     0      1           2
c     3      4           5

[2 rows x 3 columns]

使用布尔型数组的情况,注意行与列的不同切法(列切法的 : 不能省):

>>> df[&#39;Texas&#39;]>=4
a    False
c     True
d     True
Name: Texas, dtype: bool
>>> df[df[&#39;Texas&#39;]>=4]
   Ohio  Texas  California
c     3      4           5
d     6      7           8

[2 rows x 3 columns]
>>> df.ix[:,df.ix[&#39;c&#39;]>=4]
   Texas  California
a      1           2
c      4           5
d      7           8

[3 rows x 2 columns]

 

算术运算和数据对齐

pandas 最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,结果的索引取索引对的并集。自动的数据对齐在不重叠的索引处引入空值,默认为 NaN。

>>> foo = Series({&#39;a&#39;:1,&#39;b&#39;:2})
>>> foo
a    1
b    2
dtype: int64
>>> bar = Series({&#39;b&#39;:3,&#39;d&#39;:4})
>>> bar
b    3
d    4
dtype: int64
>>> foo + bar
a   NaN
b     5
d   NaN
dtype: float64

DataFrame 的对齐操作会同时发生在行和列上。

当不希望在运算结果中出现 NA 值时,可以使用前面 reindex 中提到过 fill_value 参数,不过为了传递这个参数,就需要使用对象的方法,而不是操作符:df1.add(df2,fill_value=0)。其他算术方法还有:sub(), div(), mul()

Series 和 DataFrame 之间的算术运算涉及广播,暂时先不讲。 

函数应用和映射

Numpy 的 ufuncs(元素级数组方法)也可用于操作 pandas 对象。

当希望将函数应用到 DataFrame 对象的某一行或列时,可以使用 .apply(func, axis=0, args=(), **kwds) 方法。

f = lambda x:x.max()-x.min()
>>> df
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> df.apply(f)
Ohio          6
Texas         6
California    6
dtype: int64
>>> df.apply(f,axis=1)
a    2
c    2
d    2
dtype: int64

 

排序和排名

Series 的 sort_index(ascending=True) 方法可以对 index 进行排序操作,ascending 参数用于控制升序或降序,默认为升序。

若要按值对 Series 进行排序,当使用 .order() 方法,任何缺失值默认都会被放到 Series 的末尾。

在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一个轴向的选择参数与一个 by 参数,by 参数的作用是针对某一(些)列进行排序(不能对行使用 by 参数):

>>> df.sort_index(by=&#39;Ohio&#39;)
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> df.sort_index(by=[&#39;California&#39;,&#39;Texas&#39;])
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> df.sort_index(axis=1)
   California  Ohio  Texas
a           2     0      1
c           5     3      4
d           8     6      7

[3 rows x 3 columns]

排名(Series.rank(method='average', ascending=True))的作用与排序的不同之处在于,他会把对象的 values 替换成名次(从 1 到 n)。这时唯一的问题在于如何处理平级项,方法里的 method 参数就是起这个作用的,他有四个值可选:average, min, max, first

>>> ser=Series([3,2,0,3],index=list(&#39;abcd&#39;))
>>> ser
a    3
b    2
c    0
d    3
dtype: int64
>>> ser.rank()
a    3.5
b    2.0
c    1.0
d    3.5
dtype: float64
>>> ser.rank(method=&#39;min&#39;)
a    3
b    2
c    1
d    3
dtype: float64
>>> ser.rank(method=&#39;max&#39;)
a    4
b    2
c    1
d    4
dtype: float64
>>> ser.rank(method=&#39;first&#39;)
a    3
b    2
c    1
d    4
dtype: float64

注意在 ser[0]=ser[3] 这对平级项上,不同 method 参数表现出的不同名次。

DataFrame 的 .rank(axis=0, method='average', ascending=True) 方法多了个 axis 参数,可选择按行或列分别进行排名,暂时好像没有针对全部元素的排名方法。 

统计方法

pandas 对象有一些统计方法。它们大部分都属于约简和汇总统计,用于从 Series 中提取单个值,或从 DataFrame 的行或列中提取一个 Series。

比如 DataFrame.mean(axis=0,skipna=True) 方法,当数据集中存在 NA 值时,这些值会被简单跳过,除非整个切片(行或列)全是 NA,如果不想这样,则可以通过 skipna=False 来禁用此功能:

>>> df
    one  two
a  1.40  NaN
b  7.10 -4.5
c   NaN  NaN
d  0.75 -1.3

[4 rows x 2 columns]
>>> df.mean()
one    3.083333
two   -2.900000
dtype: float64
>>> df.mean(axis=1)
a    1.400
b    1.300
c      NaN
d   -0.275
dtype: float64
>>> df.mean(axis=1,skipna=False)
a      NaN
b    1.300
c      NaN
d   -0.275
dtype: float64

其他常用的统计方法有: 

######################## ******************************************
count 非 NA 值的数量
describe 针对 Series 或 DF 的列计算汇总统计
min , max 最小值和最大值
argmin , argmax 最小值和最大值的索引位置(整数)
idxmin , idxmax 最小值和最大值的索引值
quantile 样本分位数(0 到 1)
sum 求和
mean 均值
median 中位数
mad 根据均值计算平均绝对离差
var 方差
std 标准差
skew 样本值的偏度(三阶矩)
kurt 样本值的峰度(四阶矩)
cumsum 样本值的累计和
cummin , cummax 样本值的累计最大值和累计最小值
cumprod 样本值的累计积
diff 计算一阶差分(对时间序列很有用)
pct_change 计算百分数变化

Gestion des données manquantes


L'expression principale de NA dans les pandas est np.nan De plus, None intégré à Python sera également traité comme NA. .

Il existe quatre façons de gérer NA : dropna , fillna , isnull , notnull .

is(not)null

Cette paire de méthodes effectue des applications au niveau des éléments sur l'objet, puis renvoie un tableau booléen, qui peut généralement être utilisé pour l'indexation booléenne.

dropna

Pour une série, dropna renvoie une série contenant uniquement des données non vides et des valeurs d'index.

Le problème réside dans la façon dont DataFrame est traité, car une fois supprimé, au moins une ligne (colonne) doit être perdue. La solution ici est similaire à la précédente, mais elle passe toujours un paramètre supplémentaire : dropna(axis=0, how='any', thresh=None) La valeur facultative du paramètre how est any ou all. all supprime la ligne (colonne) uniquement si tous les éléments de tranche sont NA. Un autre paramètre intéressant est le seuil, qui est de type entier. Sa fonction est que, par exemple, seuil=3, il sera conservé lorsqu'il y aura au moins 3 valeurs non NA d'affilée. En plus du type de base, le paramètre value dans

fillna

fillna(value=None, method=None, axis=0) peut également utiliser un dictionnaire, afin que différentes colonnes puissent être remplies avec différentes valeurs. L’utilisation de la méthode est la même que celle de la méthode .reindex() précédente, je n’entrerai donc pas dans les détails ici.

paramètre inplace


Il y a un point que je n'ai pas mentionné auparavant, mais après avoir écrit l'exemple complet, j'ai trouvé que c'est assez important. Parmi les méthodes des objets Series et DataFrame, celles qui modifient le tableau et renvoient un nouveau tableau ont souvent un paramètre facultatif de replace=False. S'il est défini manuellement sur True, le tableau d'origine peut être remplacé.

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!

Déclaration:
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