Python データ分析 - pandas ライブラリを使ってみる

パンダライブラリの概要

pandas は、構造化データを迅速かつ便利に処理するための多数のデータ構造と関数を提供します。 2010 年に登場して以来、Python を強力で効率的なデータ分析環境にすることに貢献してきました。 pandas で最も一般的に使用されるデータ構造オブジェクトは、列指向の 2 次元テーブル構造である DataFrame で、もう 1 つは、1 次元のラベル付き配列オブジェクトである Series です。

pandas は、NumPy の高性能配列計算機能と、スプレッドシートおよびリレーショナル データベース (SQL など) の柔軟なデータ処理機能を組み合わせています。データ サブセットの再形成、スライスとダイシング、集約、選択などの操作を簡単に完了できる高度なインデックス機能を提供します。データの操作、準備、クリーニングはデータ分析にとって最も重要なスキルであり、pandas は推奨される Python ライブラリの 1 つです。

個人的には、anaconda の jupyter 環境で pandas を学習するのが最適だと感じています。これは、ブレークポイントのデバッグや分析に便利で、コードを 1 行ずつ実行するのにも便利です。

パンダをインストールする

Windows/Linuxシステム環境でのインストール

conda経由でのインストール

conda install pandas

pip3経由でのインストール

py -3 -m pip install --upgrade pandas    #Windows系统
python3 -m pip install --upgrade pandas    #Linux系统

パンダライブラリの使用法

Pandas は多数の NumPy コーディング スタイルを採用していますが、この 2 つの最大の違いは、Pandas が表形式データと混合データを処理するために特別に設計されていることです。 NumPy は、均一な数値配列データの処理により適しています。

pandas モジュールと、一般的に使用されるサブモジュール Series および DataFrame をインポートします。

import pands as pd
from pandas import Series,DataFrame

値のリストを渡してシリーズを作成し、パンダにデフォルトの整数インデックスを作成させます。

s = pd.Series([1,3,5,np.nan,6,8])
s

出力

0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64

pandas データ構造の概要

パンダを使用するには、まずパンダの 2 つの主要なデータ構造、シリーズとデータフレームを理解する必要があります。すべての問題を解決するわけではありませんが、ほとんどのアプリケーションに対して信頼性が高く使いやすい基盤を提供します。

シリーズのデータ​​構造

Series は、データのセット (さまざまな NumPy データ型) とそれに関連付けられたデータ ラベル (インデックス) のセットで構成される 1 次元の配列のようなオブジェクトです。最も単純なシリーズは、1 セットのデータのみから生成できます。コード例:

import pandas as pd
obj = pd.Series([1,4,7,8,9])
obj

ここに画像の説明を挿入します

Series の文字列表現は、左側がインデックス、右側が値です。データのインデックスを指定しなかったため、0 ~ N-1 (N はデータの長さ) の範囲の整数インデックスが自動的に作成されます。 Series の値とインデックス プロパティを通じて、その配列表現とインデックス オブジェクトを取得することもできます。コード例:

obj.values
obj.index # like range(5)

出力:

array([ 1, 4, 7, 8, 9])
RangeIndex(start=0, stop=5, step=1)

また、各データ ポイントをマークできるインデックスを持つ Series を作成したいと考えています。コード例:

obj2 = pd.Series([1, 4, 7, 8, 9],index=['a', 'b', 'c', 'd'])
obj2
obj2.index

出力

a 1
b 4
c 7
d 8
e 9
dtype: int64

Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

ここに画像の説明を挿入します

通常の NumPy 配列と比較して、インデックスを使用して Series 内の単一またはグループの値を選択できます。コード例:

obj2[['a', 'b', 'c']] 
obj2['a']=2
obj2[['a', 'b', 'c']]

ここに画像の説明を挿入します

['a','b','c] は、整数ではなく文字列を含んでいますが、インデックス付きリストです。

NumPy 関数または NumPy のような操作 (ブール配列に基づくフィルタリング、スカラー乗算、数学関数の適用など) を使用すると、インデックス値へのリンクが保持されます。コード例:

obj2*2
np.exp(obj2)

ここに画像の説明を挿入します

Series はインデックス値をデータ値にマッピングするものであるため、固定長の順序付き辞書と考えることもできます。これは、元々辞書パラメーターを必要とする多くの関数で使用できます。コード例:

dict = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000,'Utah': 5000}
obj3 = pd.Series(dict)
obj3

出力

オハイオ州 35000

オレゴン 16000

テキサス 71000

ユタ 5000

dtype: int64

ここに画像の説明を挿入します

DataFrame データ構造

DataFrame は、順序付けされた一連の列を含む表形式のデータ構造であり、各列は異なる値のタイプ (数値、文字列、ブール値など) にすることができます。 DataFrame には行インデックスと列インデックスの両方があり、(同じインデックスを共有する) Series で構成される辞書として見ることができます。 DataFrame 内のデータは、(リスト、辞書、その他の 1 次元データ構造ではなく) 1 つ以上の 2 次元ブロックに格納されます。

DataFrame はデータを 2 次元構造で保持しますが、高次元データ (パンダの多くの高度なデータ処理関数の重要な要素である階層インデックス付きの表構造) として簡単に表すことができます。

DataFrame を作成するには多くの方法があります。最も一般的に使用される方法は、等しい長さのリストまたは NumPy 配列で構成される辞書を直接渡すことです。コード例:

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada','Nevada'],
             'year': [2000, 2001, 2002, 2001, 2002, 2003],
              'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame

その結果、DataFrame には自動的にインデックスが付けられ (Series と同じ)、すべての列が並べ替えられます。出力は次のようになります。

ここに画像の説明を挿入します

特に大きな DataFrame の場合、head メソッドは最初の 5 行を選択します。

frame.head()

列シーケンスが指定されている場合、DataFrame の列は指定された順序で配置されます。コード例:

pd.DataFrame(data,columns=['state','year','pop'])

ここに画像の説明を挿入します

渡された列がデータ内に見つからない場合、結果には欠損値が生成されます。コード例:

frame2 = pd.DataFrame(data,columns=['state','year','pop','debt'],
                                    index=['one','two','three','four','five','six'])
frame2

ここに画像の説明を挿入します

DataFrame の列とインデックスを取得します。コード例:

frame2.columns
frame2.index

出力

Index(['状態', '年', 'ポップ', '負債'], dtype='オブジェクト')

Index(['one', 'two', 'three', 'four', 'five', 'six'], dtype='object')

ここに画像の説明を挿入します

DataFrame の列は、辞書のようなタグまたは属性を通じてシリーズとして取得できます。コード例:

frame2['state']
frame2.state

ここに画像の説明を挿入します

列は、シリーズと同様の割り当てを通じて変更できます。たとえば、スカラー値または値のセット (配列またはリストの形式) を空の「借金」列に割り当てることができます。コード例は次のとおりです。

frame2.debt = np.arange(6.)
frame2

ここに画像の説明を挿入します

注: リストまたは配列を列に割り当てる場合、その長さは DataFrame の長さと一致する必要があります。

割り当てられた値が Series の場合、DataFrame のインデックスと正確に一致し、すべてのギャップは欠損値で埋められます。コード例:

val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four','five'])
frame2.debt = val
frame2

存在しない列に値を割り当てると、新しい列が作成されます。キーワード del は列を削除するために使用されます。

del の例として、ここではまず、州が「オハイオ」であるかどうかに関係なく、新しいブール値列を追加します。コード例:

frame2['eastern'] = frame2.state=='Ohio'
frame2

ここに画像の説明を挿入します

DataFrame のもう 1 つの一般的なデータ形式は、ネストされたディクショナリです。ネストされたディクショナリが DataFrame に渡されると、パンダは次のように解釈されます: 外側のディクショナリのキーは列として使用され、内側の層のキーは行インデックスとして使用されます. コード例:

#DataFrame另一种常见的数据形式是嵌套字典
pop = {
      'Nvidia':{2001:2.4,2002:3.4},
      'Intel':{2000:3.7,2001:4.7,2002:7.8}
}
frame3 = pd.DataFrame(pop,columns=['Nvidia','Intel'])
frame3

ここに画像の説明を挿入します

表 5-1 に、DataFrame コンストラクターが受け入れることができるさまざまなデータを示します。

ここに画像の説明を挿入します

インデックスオブジェクト

pandas インデックス オブジェクトは、軸ラベルとその他のメタデータ (軸名など) を管理します。シリーズまたはデータフレームを構築するとき、使用される配列またはその他のシーケンス ラベルはインデックスに変換されます。コード例は次のとおりです。

import numpy as np
import pandas as pd
obj = pd.Series(np.arange(4),index=['a','b','c','d'])
index = obj.index
#index
index[:-1]

ここに画像の説明を挿入します

注: インデックス オブジェクトは不変であるため、ユーザーは変更できません。

不変性により、複数のデータ構造間で Index オブジェクトを安全に共有できます。コード例:

#pd.Index储存所有pandas对象的轴标签
#不可变的ndarray实现有序的可切片集
labels = pd.Index(np.arange(3))
obj2 = pd.Series([1.5, -2.5, 0], index=labels)
obj2
#print(obj2.index is labels)

ここに画像の説明を挿入します

注: ユーザーはインデックス機能を頻繁に使用する必要はありませんが、一部の操作ではインデックス付きデータを含むデータが生成されるため、その仕組みを理解することが重要です。

Python のコレクションとは異なり、pandas のインデックスには重複したラベルを含めることができます。コード例:

dup_labels = pd.Index(['foo','foo','bar','alice'])
dup_labels

各インデックスには、ロジックを設定し、インデックスに含まれるデータに関する一般的な質問に答えるために使用できるメソッドとプロパティがあります。表 5-2 にこれらの関数を示します。

ここに画像の説明を挿入します

パンダはデータを選択します

import numpy as np
import pandas as pd
# dates = pd.date_range('20190325', periods=6)
dates = pd.date_range('20190325', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
print(df)
'''
             A   B   C   D
2019-03-25   0   1   2   3
2019-03-26   4   5   6   7
2019-03-27   8   9  10  11
2019-03-28  12  13  14  15
2019-03-29  16  17  18  19
2019-03-30  20  21  22  23
'''
# 检索指定A列
print(df['A'])    # 等同于print(df.A)
'''
2019-03-25     0
2019-03-26     4
2019-03-27     8
2019-03-28    12
2019-03-29    16
2019-03-30    20
Freq: D, Name: A, dtype: int64
'''
## 切片选取多行或多列
print(df[0:3])    # 等同于print(df['2019-03-25':'2019-03-27'])
'''
            A  B   C   D
2019-03-25  0  1   2   3
2019-03-26  4  5   6   7
2019-03-27  8  9  10  11
'''
# 根据标签选择数据
# 获取特定行或列
# 指定行数据
print(df.loc['2019-03-25'])
bb = df.loc['2019-03-25']
print(type(bb))
'''
A    0
B    1
C    2
D    3
Name: 2019-03-25 00:00:00, dtype: int64
<class 'pandas.core.series.Series'>
'''
# 指定列, 两种方式
print(df.loc[:, ['A', 'B']])    # print(df.loc[:, 'A':'B'])
'''
             A   B
2019-03-25   0   1
2019-03-26   4   5
2019-03-27   8   9
2019-03-28  12  13
2019-03-29  16  17
2019-03-30  20  21
'''
# 行列同时检索
cc = df.loc['20190325', ['A', 'B']]
print(cc);print(type(cc.values))# numpy ndarray
'''
A    0
B    1
Name: 2019-03-25 00:00:00, dtype: int64
<class 'numpy.ndarray'>
'''
print(df.loc['20190326', 'A'])
'''
4
'''
# 根据序列iloc获取特定位置的值, iloc是根据行数与列数来索引的
print(df.iloc[1,0])     # 13, numpy ndarray
'''
4
'''
print(df.iloc[3:5,1:3]) # 不包含末尾5或3,同列表切片
'''
             B   C
2019-03-28  13  14
2019-03-29  17  18
'''
# 跨行操作
print(df.iloc[[1, 3, 5], 1:3])
'''
             B   C
2019-03-26   5   6
2019-03-28  13  14
2019-03-30  21  22
'''
# 通过判断的筛选
print(df[df.A>8])
'''
             A   B   C   D
2019-03-28  12  13  14  15
2019-03-29  16  17  18  19
2019-03-30  20  21  22  23
'''

要約する

この記事では、pandas ライブラリの基本構造である Series と DataFrame のいくつかの特徴、pandas オブジェクトの作成方法、Series と DataFrame オブジェクトを作成するための列とインデックスの指定、代入操作、属性の取得、インデックス オブジェクトなどを主に記録します。 Series および DataFrame での操作 データの基本的な手段。

参考文献

  • 「Pythonを使ったデータ分析」

おすすめ

転載: blog.csdn.net/purple_love/article/details/134960319