パンダライブラリの概要
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を使ったデータ分析」