Python-pandas-quick-guide

提供:Dev Guides
移動先:案内検索

Pythonパンダ-はじめに

Pandasは、強力なデータ構造を使用して高性能のデータ操作および分析ツールを提供するオープンソースのPythonライブラリです。 パンダの名前は、多次元データからの計量経済学というパネルデータという言葉に由来しています。

2008年、開発者のWes McKinneyは、データ分析のための高性能で柔軟なツールが必要なときにパンダの開発を開始しました。

パンダ以前は、Pythonはデータの改ざんと準備に主に使用されていました。 データ分析にはほとんど貢献していません。 パンダはこの問題を解決しました。 Pandasを使用すると、データの出所に関係なく、データの処理と分析の5つの典型的なステップ(ロード、準備、操作、モデリング、分析)を実行できます。

Python with Pandasは、金融、経済、統計、分析などの学術および商業分野を含む幅広い分野で使用されています。

パンダの主な機能

  • デフォルトおよびカスタマイズされたインデックス付けを備えた高速で効率的なDataFrameオブジェクト。
  • さまざまなファイル形式からインメモリデータオブジェクトにデータをロードするためのツール。
  • データのアライメントと欠落データの統合処理。
  • 日付セットの形状変更とピボット。
  • 大きなデータセットのラベルベースのスライス、インデックス作成、サブセット化。
  • データ構造から列を削除または挿入できます。
  • 集計および変換のためにデータごとにグループ化します。
  • データの高性能なマージと結合。
  • 時系列機能。

Pythonパンダ-環境設定

標準のPythonディストリビューションには、Pandasモジュールがバンドルされていません。 軽量の代替手段は、人気のあるPythonパッケージインストーラー* pip。*を使用してNumPyをインストールすることです

pip install pandas

Anaconda Pythonパッケージをインストールすると、パンダはデフォルトで次のようにインストールされます-

Windows

Linux

各Linuxディストリビューションのパッケージマネージャーを使用して、1つ以上のパッケージをSciPyスタックにインストールします。

  • Ubuntuユーザー向け*
sudo apt-get install python-numpy python-scipy python-matplotlibipythonipythonnotebook
python-pandas python-sympy python-nose
  • Fedoraユーザーの場合*
sudo yum install numpyscipy python-matplotlibipython python-pandas sympy
python-nose atlas-devel

データ構造の概要

パンダは、次の3つのデータ構造を扱います-

  • シリーズ
  • DataFrame
  • パネル

これらのデータ構造はNumpy配列の上に構築されているため、高速です。

寸法と説明

これらのデータ構造を考える最良の方法は、高次元のデータ構造が低次元のデータ構造のコンテナーであることです。 たとえば、DataFrameはSeriesのコンテナであり、PanelはDataFrameのコンテナです。

Data Structure Dimensions Description
Series 1 1D labeled homogeneous array, sizeimmutable.
Data Frames 2 General 2D labeled, size-mutable tabular structure with potentially heterogeneously typed columns.
Panel 3 General 3D labeled, size-mutable array.

2次元以上の配列を作成して処理するのは退屈な作業であり、関数を記述するときにデータセットの方向を考慮するのはユーザーの負担となります。 しかし、Pandasデータ構造を使用すると、ユーザーの精神的な労力は軽減されます。

たとえば、表形式のデータ(DataFrame)では、軸0と軸1ではなく、インデックス(行)と*列*を考える方が意味的に役立ちます。

ミュータビリティ

すべてのPandasデータ構造は値可変であり(変更可能)、シリーズを除きすべてサイズ可変です。 シリーズはサイズ不変です。

-DataFrameは広く使用されており、最も重要なデータ構造の1つです。 パネルの使用はずっと少なくなります。

シリーズ

シリーズは、同種のデータを持つ構造のような1次元配列です。 たとえば、次のシリーズは整数10、23、56、…のコレクションです

10 23 56 17 52 61 73 90 26 72

キーポイント

  • 同種データ
  • サイズ不変
  • 可変データの値

DataFrame

DataFrameは、異種データを含む2次元配列です。 例えば、

Name Age Gender Rating
Steve 32 Male 3.45
Lia 28 Female 4.6
Vin 45 Male 3.9
Katie 38 Female 2.78

この表は、組織の営業チームのデータと全体的なパフォーマンス評価を表します。 データは行と列で表されます。 各列は属性を表し、各行は人を表します。

列のデータ型

4列のデータ型は次のとおりです-

Column Type
Name String
Age Integer
Gender String
Rating Float

キーポイント

  • 異種データ
  • サイズ変更可能
  • 可変データ

パネル

パネルは、異種データを含む3次元データ構造です。 パネルをグラフィカルに表現するのは困難です。 ただし、パネルはDataFrameのコンテナーとして示すことができます。

キーポイント

  • 異種データ
  • サイズ変更可能
  • 可変データ

Pythonパンダ-シリーズ

Seriesは、任意のタイプ(整数、文字列、浮動小数点、Pythonオブジェクトなど)のデータを保持できる1次元のラベル付き配列です。 軸ラベルはまとめてインデックスと呼ばれます。

pandas.Series

パンダシリーズは、次のコンストラクタを使用して作成することができます-

pandas.Series( data, index, dtype, copy)

コンストラクタのパラメータは次のとおりです-

Sr.No Parameter & Description
1

data

データは、ndarray、リスト、定数などのさまざまな形式を取ります

2

index

インデックス値は一意でハッシュ可能で、データと同じ長さでなければなりません。 インデックスが渡されない場合のデフォルトの* np.arrange(n)*。

3

dtype

dtypeはデータ型用です。 なしの場合、データ型が推測されます

4

copy

データをコピーします。 デフォルトはFalse

シリーズは、次のようなさまざまな入力を使用して作成できます-

  • アレイ
  • Dict
  • スカラー値または定数

空のシリーズを作成する

作成できる基本シリーズは空のシリーズです。

#import the pandas library and aliasing as pd
import pandas as pd
s = pd.Series()
print s

その*出力*は次のとおりです-

Series([], dtype: float64)

ndarrayからシリーズを作成する

データがndarrayの場合、渡されるインデックスは同じ長さでなければなりません。 インデックスが渡されない場合、デフォルトではインデックスは* range(n)になります。 *n は配列の長さ、つまり[0,1,2,3…]です。 * range(len(array))-1]。*

例1

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data)
print s

その*出力*は次のとおりです-

0   a
1   b
2   c
3   d
dtype: object

インデックスを渡さなかったので、デフォルトでは、0から len(data)-1 、つまり0から3の範囲のインデックスを割り当てました。

例2

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103])
print s

その*出力*は次のとおりです-

100  a
101  b
102  c
103  d
dtype: object

ここでインデックス値を渡しました。 これで、カスタマイズされたインデックス値が出力に表示されます。

dictからシリーズを作成する

*dict* を入力として渡すことができ、インデックスが指定されていない場合、辞書キーはソートされた順序で取得されてインデックスを構築します。 *index* が渡されると、インデックスのラベルに対応するデータの値が取り出されます。

例1

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
print s

その*出力*は次のとおりです-

a 0.0
b 1.0
c 2.0
dtype: float64
*Observe* -辞書キーはインデックスの構築に使用されます。

例2

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data,index=['b','c','d','a'])
print s

その*出力*は次のとおりです-

b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
*Observe* -インデックスの順序は維持され、欠落している要素はNaN(非数)で埋められます。

Scalarからシリーズを作成する

データがスカラー値の場合、インデックスを提供する必要があります。 値は index の長さと一致するように繰り返されます

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
s = pd.Series(5, index=[0, 1, 2, 3])
print s

その*出力*は次のとおりです-

0  5
1  5
2  5
3  5
dtype: int64

位置のあるシリーズのデータ​​へのアクセス

シリーズのデータ​​には、* ndarray。*のデータと同様にアクセスできます。

例1

最初の要素を取得します。 既に知っているように、カウントは配列のゼロから始まります。つまり、最初の要素はzero ^ th ^の位置に格納されます。

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve the first element
print s[0]

その*出力*は次のとおりです-

1

例2

シリーズの最初の3つの要素を取得します。 :がその前に挿入されると、そのインデックス以降のすべてのアイテムが抽出されます。 2つのパラメーター(間に:がある)が使用される場合、2つのインデックス間のアイテム(ストップインデックスを含まない)

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve the first three element
print s[:3]

その*出力*は次のとおりです-

a  1
b  2
c  3
dtype: int64

実施例3

最後の3つの要素を取得します。

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve the last three element
print s[-3:]

その*出力*は次のとおりです-

c  3
d  4
e  5
dtype: int64

ラベルを使用してデータを取得(インデックス)

Seriesは、インデックスラベルで値を取得および設定できるという点で、固定サイズの dict に似ています。

例1

インデックスラベル値を使用して単一の要素を取得します。

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve a single element
print s['a']

その*出力*は次のとおりです-

1

例2

インデックスラベル値のリストを使用して複数の要素を取得します。

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve multiple elements
print s[[a','c','d']]

その*出力*は次のとおりです-

a  1
c  3
d  4
dtype: int64

実施例3

ラベルが含まれていない場合、例外が発生します。

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve multiple elements
print s['f']

その*出力*は次のとおりです-

…
KeyError: 'f'

Pythonパンダ-DataFrame

データフレームは2次元のデータ構造です。つまり、データは表形式で行と列に配置されます。

DataFrameの機能

  • 潜在的に列は異なるタイプです
  • サイズ-可変
  • ラベル付き軸(行と列) *行と列に対して算術演算を実行できます

構造

学生のデータでデータフレームを作成していると仮定しましょう。

構造テーブル

SQLテーブルまたはスプレッドシートのデータ表現と考えることができます。

pandas.DataFrame

パンダのDataFrameは、次のコンストラクタを使用して作成することができます-

pandas.DataFrame( data, index, columns, dtype, copy)

コンストラクタのパラメータは次のとおりです-

Sr.No Parameter & Description
1
  • data*

データは、ndarray、series、map、lists、dict、constant、および別のDataFrameなどのさまざまな形式を取ります。

2

index

行ラベルの場合、インデックスが渡されない場合、結果のフレームに使用されるインデックスはオプションのデフォルトnp.arrange(n)です。

3

columns

列ラベルの場合、オプションのデフォルト構文は-np.arrange(n)です。 これは、インデックスが渡されない場合にのみ当てはまります。

4

dtype

各列のデータ型。

5

copy

デフォルトがFalseの場合、このコマンド(またはそれが何であれ)はデータのコピーに使用されます。

DataFrameを作成

パンダDataFrameはのような様々な入力を使用して作成することができます-

  • リスト
  • dict
  • シリーズ
  • Numpy ndarrays
  • 別のデータフレーム

この章の以降のセクションでは、これらの入力を使用してDataFrameを作成する方法について説明します。

空のデータフレームを作成する

作成できる基本的なDataFrameは空のDataframeです。

#import the pandas library and aliasing as pd
import pandas as pd
df = pd.DataFrame()
print df

その*出力*は次のとおりです-

Empty DataFrame
Columns: []
Index: []

リストからデータフレームを作成する

DataFrameは、単一のリストまたはリストのリストを使用して作成できます。

例1

import pandas as pd
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print df

その*出力*は次のとおりです-

     0
0    1
1    2
2    3
3    4
4    5

例2

import pandas as pd
data = [[Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print df

その*出力*は次のとおりです-

      Name      Age
0     Alex      10
1     Bob       12
2     Clarke    13

実施例3

import pandas as pd
data = [[Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print df

その*出力*は次のとおりです-

      Name     Age
0     Alex     10.0
1     Bob      12.0
2     Clarke   13.0

注意- dtype パラメータは、Ageカラムのタイプを浮動小数点に変更します。

ndarrays/ListsのDictからDataFrameを作成します

すべての ndarrays は同じ長さでなければなりません。 インデックスが渡される場合、インデックスの長さは配列の長さと等しくなければなりません。

インデックスが渡されない場合、デフォルトでは、インデックスはrange(n)になります。ここで、 n は配列の長さです。

例1

import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print df

その*出力*は次のとおりです-

      Age      Name
0     28        Tom
1     34       Jack
2     29      Steve
3     42      Ricky

-値0、1、2、3を確認します。 それらは、関数range(n)を使用してそれぞれに割り当てられるデフォルトのインデックスです。

例2

ここで、配列を使用してインデックス付きDataFrameを作成します。

import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print df

その*出力*は次のとおりです-

         Age    Name
rank1    28      Tom
rank2    34     Jack
rank3    29    Steve
rank4    42    Ricky

-観察、 index パラメータは各行にインデックスを割り当てます。

辞書のリストからデータフレームを作成する

辞書のリストを入力データとして渡して、DataFrameを作成できます。 辞書キーはデフォルトで列名として使用されます。

例1

次の例は、辞書のリストを渡すことでDataFrameを作成する方法を示しています。

import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print df

その*出力*は次のとおりです-

    a    b      c
0   1   2     NaN
1   5   10   20.0

-観察、NaN(Not a Number)が欠落領域に追加されます。

例2

次の例は、辞書と行インデックスのリストを渡すことでDataFrameを作成する方法を示しています。

import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print df

その*出力*は次のとおりです-

        a   b       c
first   1   2     NaN
second  5   10   20.0

実施例3

次の例は、辞書、行インデックス、および列インデックスのリストを使用してDataFrameを作成する方法を示しています。

import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]

#With two column indices, values same as dictionary keys
df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])

#With two column indices with one index with other name
df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
print df1
print df2

その*出力*は次のとおりです-

#df1 output
         a  b
first    1  2
second   5  10

#df2 output
         a  b1
first    1  NaN
second   5  NaN

-観察、df2 DataFrameはディクショナリキー以外の列インデックスで作成されます。したがって、所定の位置にNaNを追加しました。 一方、df1は辞書キーと同じ列インデックスで作成されるため、NaNが追加されます。

シリーズの辞書からデータフレームを作成する

シリーズの辞書を渡して、DataFrameを作成できます。 結果のインデックスは、渡されたすべてのシリーズインデックスの結合です。

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df

その*出力*は次のとおりです-

      one    two
a     1.0    1
b     2.0    2
c     3.0    3
d     NaN    4

-シリーズ1では、ラベル「」d *は渡されませんが、結果では、 *d ラベルではNaNにNaNが追加されます。

例を通して、列の選択、追加、および*削除*を理解しましょう。

列の選択

これを理解するには、DataFrameから列を選択します。

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df ['one']

その*出力*は次のとおりです-

a     1.0
b     2.0
c     3.0
d     NaN
Name: one, dtype: float64

列の追加

これを理解するには、既存のデータフレームに新しい列を追加します。

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)

# Adding a new column to an existing DataFrame object with column label by passing new series

print ("Adding a new column by passing as Series:")
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print df

print ("Adding a new column using the existing columns in DataFrame:")
df['four']=df['one']+df['three']

print df

その*出力*は次のとおりです-

Adding a new column by passing as Series:
     one   two   three
a    1.0    1    10.0
b    2.0    2    20.0
c    3.0    3    30.0
d    NaN    4    NaN

Adding a new column using the existing columns in DataFrame:
      one   two   three    four
a     1.0    1    10.0     11.0
b     2.0    2    20.0     22.0
c     3.0    3    30.0     33.0
d     NaN    4     NaN     NaN

列の削除

列は削除またはポップできます。その方法を理解するために例を挙げましょう。

# Using the previous DataFrame, we will delete a column
# using del function
import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
   'three' : pd.Series([10,20,30], index=['a','b','c'])}

df = pd.DataFrame(d)
print ("Our dataframe is:")
print df

# using del function
print ("Deleting the first column using DEL function:")
del df['one']
print df

# using pop function
print ("Deleting another column using POP function:")
df.pop('two')
print df

その*出力*は次のとおりです-

Our dataframe is:
      one   three  two
a     1.0    10.0   1
b     2.0    20.0   2
c     3.0    30.0   3
d     NaN     NaN   4

Deleting the first column using DEL function:
      three    two
a     10.0     1
b     20.0     2
c     30.0     3
d     NaN      4

Deleting another column using POP function:
   three
a  10.0
b  20.0
c  30.0
d  NaN

行の選択、追加、および削除

例を通して行の選択、追加、削除を理解します。 選択の概念から始めましょう。

ラベルによる選択

行を選択するには、行ラベルを loc 関数に渡します。

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df.loc['b']

その*出力*は次のとおりです-

one 2.0
two 2.0
Name: b, dtype: float64

結果は、DataFrameの列名としてラベルを持つシリーズです。 そして、シリーズの名前は、それが取得されるラベルです。

整数位置による選択

整数の位置を iloc 関数に渡すことで行を選択できます。

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df.iloc[2]

その*出力*は次のとおりです-

one   3.0
two   3.0
Name: c, dtype: float64

スライス行

「:」演算子を使用して、複数の行を選択できます。

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df[2:4]

その*出力*は次のとおりです-

   one  two
c  3.0    3
d  NaN    4

行の追加

*append* 関数を使用して、DataFrameに新しい行を追加します。 この関数は、行を最後に追加します。
import pandas as pd

df = pd.DataFrame([[columns = ['a','b'])
df2 = pd.DataFrame([[columns = ['a','b'])

df = df.append(df2)
print df

その*出力*は次のとおりです-

   a  b
0  1  2
1  3  4
0  5  6
1  7  8

行の削除

インデックスラベルを使用して、DataFrameから行を削除またはドロップします。 ラベルが重複している場合、複数の行が削除されます。

上記の例では、ラベルが重複しています。 ラベルをドロップして、ドロップされる行数を確認します。

import pandas as pd

df = pd.DataFrame([[columns = ['a','b'])
df2 = pd.DataFrame([[columns = ['a','b'])

df = df.append(df2)

# Drop rows with label 0
df = df.drop(0)

print df

その*出力*は次のとおりです-

  a b
1 3 4
1 7 8

上記の例では、2つの行に同じラベル0が含まれているため、2つの行が削除されました。

Pythonパンダ-パネル

パネル*は、データの3Dコンテナです。 「パネルデータ」という用語は計量経済学から派生したものであり、パンダという名前の一部を担っています- pan(el)-da(ta)*-s。

3つの軸の名前は、パネルデータに関連する操作を説明する意味的な意味を与えることを意図しています。 彼らは-

  • items -軸0、各アイテムは内部に含まれるDataFrameに対応します。
  • major_axis -軸1、これは各DataFrameのインデックス(行)です。
  • minor_axis -軸2、各DataFrameの列です。

pandas.Panel()

パネルは、次のコンストラクタを使用して作成できます-

pandas.Panel(data, items, major_axis, minor_axis, dtype, copy)

コンストラクタのパラメータは次のとおりです-

Parameter Description
data Data takes various forms like ndarray, series, map, lists, dict, constants and also another DataFrame
items axis=0
major_axis axis=1
minor_axis axis=2
dtype Data type of each column
copy Copy data. Default, false

パネルを作成

パネルは、次のような複数の方法を使用して作成できます-

  • ndarraysから
  • DataFramesの辞書から

3D ndarrayから

# creating an empty panel
import pandas as pd
import numpy as np

data = np.random.rand(2,4,5)
p = pd.Panel(data)
print p

その*出力*は次のとおりです-

<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 5 (minor_axis)
Items axis: 0 to 1
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 4

注意-空のパネルと上のパネルの寸法を確認してください。すべてのオブジェクトは異なります。

DataFrameオブジェクトの辞書から

#creating an empty panel
import pandas as pd
import numpy as np

data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
   'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p

その*出力*は次のとおりです-

Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 2

空のパネルを作成する

空のパネルは、次のようにパネルコンストラクタを使用して作成することができます-

#creating an empty panel
import pandas as pd
p = pd.Panel()
print p

その*出力*は次のとおりです-

<class 'pandas.core.panel.Panel'>
Dimensions: 0 (items) x 0 (major_axis) x 0 (minor_axis)
Items axis: None
Major_axis axis: None
Minor_axis axis: None

パネルからデータを選択する

を使用してパネルからデータを選択します-

  • アイテム
  • Major_axis
  • Minor_axis

アイテムを使用する

# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
   'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p['Item1']

その*出力*は次のとおりです-

            0          1          2
0    0.488224  -0.128637   0.930817
1    0.417497   0.896681   0.576657
2   -2.775266   0.571668   0.290082
3   -0.400538  -0.144234   1.110535

2つのアイテムがあり、item1を取得しました。 結果は、4行3列のDataFrameになります。これらは、 Major_axis および Minor_axis ディメンションです。

major_axisを使用する

データには、* panel.major_axis(index)*メソッドを使用してアクセスできます。

# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
   'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.major_xs(1)

その*出力*は次のとおりです-

      Item1       Item2
0   0.417497    0.748412
1   0.896681   -0.557322
2   0.576657       NaN

minor_axisを使用する

データには、* panel.minor_axis(index)。*メソッドを使用してアクセスできます。

# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
   'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.minor_xs(1)

その*出力*は次のとおりです-

       Item1       Item2
0   -0.128637   -1.047032
1    0.896681   -0.557322
2    0.571668    0.431953
3   -0.144234    1.302466

-寸法の変化を観察します。

Pythonパンダ-基本機能

ここまでで、3つのPandas DataStructureとそれらの作成方法について学びました。 リアルタイムデータ処理における重要性のため、主にDataFrameオブジェクトに焦点を当て、いくつかの他のDataStructureについても説明します。

シリーズの基本機能

Sr.No. Attribute or Method & Description
1

axes

行軸ラベルのリストを返します

2

dtype

オブジェクトのdtypeを返します。

3

empty

シリーズが空の場合、Trueを返します。

4

ndim

基になるデータの次元数を定義1で返します。

5

size

基になるデータの要素の数を返します。

6

values

シリーズをndarrayとして返します。

7

head()

最初のn行を返します。

8

tail()

最後のn行を返します。

ここでシリーズを作成し、上記の表にまとめられた属性操作をすべて見てみましょう。

import pandas as pd
import numpy as np

#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print s

その*出力*は次のとおりです-

0   0.967853
1  -0.148368
2  -1.395906
3  -1.758394
dtype: float64

axes

シリーズのラベルのリストを返します。

import pandas as pd
import numpy as np

#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("The axes are:")
print s.axes

その*出力*は次のとおりです-

The axes are:
[RangeIndex(start=0, stop=4, step=1)]

上記の結果は、0から5までの値のリストのコンパクトな形式、つまり[0,1,2,3,4]です。

空の

オブジェクトが空かどうかを示すブール値を返します。 Trueは、オブジェクトが空であることを示します。

import pandas as pd
import numpy as np

#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("Is the Object empty?")
print s.empty

その*出力*は次のとおりです-

Is the Object empty?
False

ndim

オブジェクトの次元数を返します。 定義により、シリーズは1Dデータ構造であるため、

import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s

print ("The dimensions of the object:")
print s.ndim

その*出力*は次のとおりです-

0   0.175898
1   0.166197
2  -0.609712
3  -1.377000
dtype: float64

The dimensions of the object:
1

size

シリーズのサイズ(長さ)を返します。

import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(2))
print s
print ("The size of the object:")
print s.size

その*出力*は次のとおりです-

0   3.078058
1  -1.207803
dtype: float64

The size of the object:
2

シリーズの実際のデータを配列として返します。

import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s

print ("The actual data series is:")
print s.values

その*出力*は次のとおりです-

0   1.787373
1  -0.605159
2   0.180477
3  -0.140922
dtype: float64

The actual data series is:
[ 1.78737302 -0.60515881 0.18047664 -0.1409218 ]

頭と尾

SeriesまたはDataFrameオブジェクトの小さなサンプルを表示するには、head()およびtail()メソッドを使用します。

  • head()は最初の *n 行を返します(インデックス値を監視します)。 表示する要素のデフォルト数は5ですが、カスタム数を渡すこともできます。
import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s

print ("The first two rows of the data series:")
print s.head(2)

その*出力*は次のとおりです-

The original series is:
0   0.720876
1  -0.765898
2   0.479221
3  -0.139547
dtype: float64

The first two rows of the data series:
0   0.720876
1  -0.765898
dtype: float64
  • tail()は、最後の *n 行を返します(インデックス値を監視します)。 表示する要素のデフォルト数は5ですが、カスタム数を渡すこともできます。
import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s

print ("The last two rows of the data series:")
print s.tail(2)

その*出力*は次のとおりです-

The original series is:
0 -0.655091
1 -0.881407
2 -0.608592
3 -2.341413
dtype: float64

The last two rows of the data series:
2 -0.608592
3 -2.341413
dtype: float64

DataFrameの基本機能

ここで、DataFrameの基本機能について理解しましょう。 次の表に、DataFrameの基本機能に役立つ重要な属性またはメソッドを示します。

Sr.No. Attribute or Method & Description
1

T

行と列を入れ替えます。

2

axes

行軸ラベルと列軸ラベルを唯一のメンバーとして含むリストを返します。

3

dtypes

このオブジェクトのdtypeを返します。

4

empty

NDFrameが完全に空の場合[アイテムなし]の場合はtrue。軸の長さが0の場合。

5

ndim

軸の数/配列の次元。

6

shape

DataFrameの次元を表すタプルを返します。

7

size

NDFrameの要素の数。

8

values

NDFrameのナンピー表現。

9

head()

最初のn行を返します。

10

tail()

最後のn行を返します。

DataFrameを作成し、上記の属性がどのように機能するかをすべて見てみましょう。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data series is:")
print df

その*出力*は次のとおりです-

Our data series is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80

T(転置)

DataFrameの転置を返します。 行と列が入れ替わります。

import pandas as pd
import numpy as np

# Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

# Create a DataFrame
df = pd.DataFrame(d)
print ("The transpose of the data series is:")
print df.T

その*出力*は次のとおりです-

The transpose of the data series is:
         0     1       2      3      4      5       6
Age      25    26      25     23     30     29      23
Name     Tom   James   Ricky  Vin    Steve  Smith   Jack
Rating   4.23  3.24    3.98   2.56   3.2    4.6     3.8

axes

行軸ラベルと列軸ラベルのリストを返します。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Row axis labels and column axis labels are:")
print df.axes

その*出力*は次のとおりです-

Row axis labels and column axis labels are:

[RangeIndex(start=0, stop=7, step=1), Index([u'Age', u'Name', u'Rating'],
dtype='object')]

dtypes

各列のデータ型を返します。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("The data types of each column are:")
print df.dtypes

その*出力*は次のとおりです-

The data types of each column are:
Age     int64
Name    object
Rating  float64
dtype: object

空の

オブジェクトが空かどうかを示すブール値を返します。 Trueは、オブジェクトが空であることを示します。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Is the object empty?")
print df.empty

その*出力*は次のとおりです-

Is the object empty?
False

ndim

オブジェクトの次元数を返します。 定義により、DataFrameは2Dオブジェクトです。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The dimension of the object is:")
print df.ndim

その*出力*は次のとおりです-

Our object is:
      Age    Name     Rating
0     25     Tom      4.23
1     26     James    3.24
2     25     Ricky    3.98
3     23     Vin      2.56
4     30     Steve    3.20
5     29     Smith    4.60
6     23     Jack     3.80

The dimension of the object is:
2

形状

DataFrameの次元を表すタプルを返します。 タプル(a、b)。ここで、aは行数を表し、 b は列数を表します。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The shape of the object is:")
print df.shape

その*出力*は次のとおりです-

Our object is:
   Age   Name    Rating
0  25    Tom     4.23
1  26    James   3.24
2  25    Ricky   3.98
3  23    Vin     2.56
4  30    Steve   3.20
5  29    Smith   4.60
6  23    Jack    3.80

The shape of the object is:
(7, 3)

size

DataFrameの要素の数を返します。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The total number of elements in our object is:")
print df.size

その*出力*は次のとおりです-

Our object is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80

The total number of elements in our object is:
21

DataFrameの実際のデータを* NDarray。*として返します

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The actual data in our data frame is:")
print df.values

その*出力*は次のとおりです-

Our object is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80
The actual data in our data frame is:
[[Tom' 4.23]
[26 'James' 3.24]
[25 'Ricky' 3.98]
[23 'Vin' 2.56]
[30 'Steve' 3.2]
[29 'Smith' 4.6]
[23 'Jack' 3.8]]

頭と尾

DataFrameオブジェクトの小さなサンプルを表示するには、* head()およびtail()メソッドを使用します。 * head()*は最初の *n 行を返します(インデックス値を監視します)。 表示する要素のデフォルト数は5ですが、カスタム数を渡すこともできます。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The first two rows of the data frame is:")
print df.head(2)

その*出力*は次のとおりです-

Our data frame is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80

The first two rows of the data frame is:
   Age   Name   Rating
0  25    Tom    4.23
1  26    James  3.24
  • tail()は、最後の *n 行を返します(インデックス値を監視します)。 表示する要素のデフォルト数は5ですが、カスタム数を渡すこともできます。
import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The last two rows of the data frame is:")
print df.tail(2)

その*出力*は次のとおりです-

Our data frame is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80

The last two rows of the data frame is:
    Age   Name    Rating
5   29    Smith    4.6
6   23    Jack     3.8

Pythonパンダ-記述統計

多数のメソッドが、DataFrameの記述統計およびその他の関連操作をまとめて計算します。 これらのほとんどは* sum()、mean()などの集約ですが、 sumsum()などの一部は同じサイズのオブジェクトを生成します。 一般的に、これらのメソッドは_ndarray。\ {sum、std、…​}、_と同様に *axis 引数を取りますが、軸は名前または整数で指定できます

  • DataFrame -「インデックス」(軸= 0、デフォルト)、「列」(軸= 1)

DataFrameを作成し、この章全体でこのオブジェクトをすべての操作に使用します。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df

その*出力*は次のとおりです-

    Age  Name   Rating
0   25   Tom     4.23
1   26   James   3.24
2   25   Ricky   3.98
3   23   Vin     2.56
4   30   Steve   3.20
5   29   Smith   4.60
6   23   Jack    3.80
7   34   Lee     3.78
8   40   David   2.98
9   30   Gasper  4.80
10  51   Betina  4.10
11  46   Andres  3.65

和()

要求された軸の値の合計を返します。 デフォルトでは、軸はインデックス(axis = 0)です。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.sum()

その*出力*は次のとおりです-

Age                                                    382
Name     TomJamesRickyVinSteveSmithJackLeeDavidGasperBe...
Rating                                               44.92
dtype: object

各列は個別に追加されます(文字列が追加されます)。

軸= 1

この構文は、以下に示す出力を提供します。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.sum(1)

その*出力*は次のとおりです-

0    29.23
1    29.24
2    28.98
3    25.56
4    33.20
5    33.60
6    26.80
7    37.78
8    42.98
9    34.80
10   55.10
11   49.65
dtype: float64

平均()

平均値を返します

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.mean()

その*出力*は次のとおりです-

Age       31.833333
Rating     3.743333
dtype: float64

std()

数値列のブレセル標準偏差を返します。

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.std()

その*出力*は次のとおりです-

Age       9.232682
Rating    0.661628
dtype: float64

機能と説明

Python Pandasの記述統計の機能を理解しましょう。 次の表は、重要な機能の一覧です-

Sr.No. Function Description
1 count() Number of non-null observations
2 sum() Sum of values
3 mean() Mean of Values
4 median() Median of Values
5 mode() Mode of values
6 std() Standard Deviation of the Values
7 min() Minimum Value
8 max() Maximum Value
9 abs() Absolute Value
10 prod() Product of Values
11 cumsum() Cumulative Sum
12 cumprod() Cumulative Product

-DataFrameは異種データ構造であるため。 一般的な操作はすべての機能で機能するわけではありません。

  • * sum()、cumsum()などの関数は、エラーなしで数値と文字(または)文字列データ要素の両方で機能します。 *n の練習ですが、文字の集計は一般的に使用されることはありませんが、これらの関数は例外をスローしません。
  • * abs()、cumprod()*などの関数は、DataFrameに文字または文字列データが含まれている場合、そのような操作を実行できないため例外をスローします。

データの要約

  • describe()*関数は、DataFrame列に関連する統計の要約を計算します。
import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.describe()

その*出力*は次のとおりです-

               Age         Rating
count    12.000000      12.000000
mean     31.833333       3.743333
std       9.232682       0.661628
min      23.000000       2.560000
25%      25.000000       3.230000
50%      29.500000       3.790000
75%      35.500000       4.132500
max      51.000000       4.800000

この関数は、 mean、std 、および IQR 値を提供します。 また、関数は文字列を除外し、数値列に関する概要を提供します。 'include' は、要約のために考慮する必要がある列に関する必要な情報を渡すために使用される引数です。 値のリストを取得します。デフォルトでは、「number」。

  • オブジェクト-文字列の列を要約します
  • number -数値列を要約します
  • all -すべての列をまとめます(リスト値として渡すべきではありません)

今、プログラムで次のステートメントを使用して、出力を確認します-

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.describe(include=['object'])

その*出力*は次のとおりです-

          Name
count       12
unique      12
top      Ricky
freq         1

今、次のステートメントを使用して、出力を確認します-

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df. describe(include='all')

その*出力*は次のとおりです-

          Age          Name       Rating
count   12.000000        12    12.000000
unique        NaN        12          NaN
top           NaN     Ricky          NaN
freq          NaN         1          NaN
mean    31.833333       NaN     3.743333
std      9.232682       NaN     0.661628
min     23.000000       NaN     2.560000
25%     25.000000       NaN     3.230000
50%     29.500000       NaN     3.790000
75%     35.500000       NaN     4.132500
max     51.000000       NaN     4.800000

Python Pandas-関数アプリケーション

独自のライブラリまたは別のライブラリの機能をPandasオブジェクトに適用するには、3つの重要な方法に注意する必要があります。 これらの方法については以下で説明しました。 使用する適切な方法は、関数がDataFrame全体、行単位または列単位、または要素単位で動作することを期待するかどうかによって異なります。

  • 表ごとの関数アプリケーション:pipe()
  • 行または列のワイズ関数アプリケーション:apply()
  • 要素ごとの関数アプリケーション:applymap()

テーブル単位の関数アプリケーション

関数と適切な数のパラメーターをパイプ引数として渡すことにより、カスタム操作を実行できます。 したがって、操作はDataFrame全体で実行されます。

たとえば、値2をDataFrameのすべての要素に追加します。 その後、

加算機能

加算関数は、2つの数値をパラメーターとして追加し、合計を返します。

def adder(ele1,ele2):
   return ele1+ele2

ここで、カスタム関数を使用して、DataFrameで操作を実行します。

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)

完全なプログラムを見てみましょう-

import pandas as pd
import numpy as np

def adder(ele1,ele2):
   return ele1+ele2

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)
print df.apply(np.mean)

その*出力*は次のとおりです-

        col1       col2       col3
0   2.176704   2.219691   1.509360
1   2.222378   2.422167   3.953921
2   2.241096   1.135424   2.696432
3   2.355763   0.376672   1.182570
4   2.308743   2.714767   2.130288

行または列のワイズ関数アプリケーション

任意の関数は、* apply()*メソッドを使用して、DataFrameまたはPanelの軸に沿って適用できます。これは、記述統計メソッドと同様に、オプションの軸引数を取ります。 デフォルトでは、操作は列ごとに実行され、各列を配列のように取ります。

例1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean)
print df.apply(np.mean)

その*出力*は次のとおりです-

col1   -0.288022
col2    1.044839
col3   -0.187009
dtype: float64
*axis* パラメータを渡すことにより、行単位で操作を実行できます。

例2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean,axis=1)
print df.apply(np.mean)

その*出力*は次のとおりです-

col1    0.034093
col2   -0.152672
col3   -0.229728
dtype: float64

実施例3

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(lambda x: x.max() - x.min())
print df.apply(np.mean)

その*出力*は次のとおりです-

col1   -0.167413
col2   -0.370495
col3   -0.707631
dtype: float64

要素ワイズ関数アプリケーション

すべての関数をベクトル化できるわけではなく(別の配列も値も返さないNumPy配列も)、DataFrameの* applymap()およびSeriesの analyously map()*メソッドは、単一の値を取り、単一の値を返すPython関数を受け入れます値。

例1

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])

# My custom function
df['col1'].map(lambda x:x*100)
print df.apply(np.mean)

その*出力*は次のとおりです-

col1    0.480742
col2    0.454185
col3    0.266563
dtype: float64

例2

import pandas as pd
import numpy as np

# My custom function
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.applymap(lambda x:x*100)
print df.apply(np.mean)

その*出力*は次のとおりです-

col1    0.395263
col2    0.204418
col3   -0.795188
dtype: float64

Pythonパンダ-インデックスの再作成

  • 再インデックス*は、DataFrameの行ラベルと列ラベルを変更します。 _reindex_とは、特定の軸に沿ってラベルの特定のセットに一致するようにデータを適合させることを意味します。

複数の操作は、次のようなインデックス作成によって実現できます-

  • 新しいラベルのセットと一致するように既存のデータを並べ替えます。
  • ラベルのデータが存在しないラベル位置に欠損値(NA)マーカーを挿入します。

import pandas as pd
import numpy as np

N=20

df = pd.DataFrame({
   'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
   'x': np.linspace(0,stop=N-1,num=N),
   'y': np.random.rand(N),
   'C': np.random.choice(['Low','Medium','High'],N).tolist(),
   'D': np.random.normal(100, 10, size=(N)).tolist()
})

#reindex the DataFrame
df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])

print df_reindexed

その*出力*は次のとおりです-

            A    C     B
0  2016-01-01  Low   NaN
2  2016-01-03  High  NaN
5  2016-01-06  Low   NaN

他のオブジェクトに合わせて再インデックス付け

オブジェクトを取得し、その軸のインデックスを再作成して、別のオブジェクトと同じラベルを付けることができます。 同じことを理解するには、次の例を検討してください。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])

df1 = df1.reindex_like(df2)
print df1

その*出力*は次のとおりです-

          col1         col2         col3
0    -2.467652    -1.211687    -0.391761
1    -0.287396     0.522350     0.562512
2    -0.255409    -0.483250     1.866258
3    -1.150467    -0.646493    -0.222462
4     0.152768    -2.056643     1.877233
5    -1.155997     1.528719    -1.343719
6    -1.015606    -1.245936    -0.295275

-ここでは、 df1 DataFrameが変更され、 df2 のようにインデックスが再作成されます。 列名は一致する必要があります。一致しない場合、列ラベル全体にNANが追加されます。

再インデックス中の塗りつぶし

  • reindex()*は、オプションのパラメーターメソッドを取ります。これは、次のような値を持つ充填メソッドです-
  • pad/ffill -値を前方に埋める
  • bfill/backfill -値を逆方向に埋める
  • nearest -最も近いインデックス値から塗りつぶします

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])

# Padding NAN's
print df2.reindex_like(df1)

# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill:")
print df2.reindex_like(df1,method='ffill')

その*出力*は次のとおりです-

         col1        col2       col3
0    1.311620   -0.707176   0.599863
1   -0.423455   -0.700265   1.133371
2         NaN         NaN        NaN
3         NaN         NaN        NaN
4         NaN         NaN        NaN
5         NaN         NaN        NaN

Data Frame with Forward Fill:
         col1        col2        col3
0    1.311620   -0.707176    0.599863
1   -0.423455   -0.700265    1.133371
2   -0.423455   -0.700265    1.133371
3   -0.423455   -0.700265    1.133371
4   -0.423455   -0.700265    1.133371
5   -0.423455   -0.700265    1.133371

-最後の4行はパディングされます。

再インデックス中の塗りつぶしの制限

limit引数は、インデックス再作成中の塗りつぶしをさらに制御します。 制限は、連続した一致の最大カウントを指定します。 同じことを理解するために、次の例を考えてみましょう-

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])

# Padding NAN's
print df2.reindex_like(df1)

# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill limiting to 1:")
print df2.reindex_like(df1,method='ffill',limit=1)

その*出力*は次のとおりです-

         col1        col2        col3
0    0.247784    2.128727    0.702576
1   -0.055713   -0.021732   -0.174577
2         NaN         NaN         NaN
3         NaN         NaN         NaN
4         NaN         NaN         NaN
5         NaN         NaN         NaN

Data Frame with Forward Fill limiting to 1:
         col1        col2        col3
0    0.247784    2.128727    0.702576
1   -0.055713   -0.021732   -0.174577
2   -0.055713   -0.021732   -0.174577
3         NaN         NaN         NaN
4         NaN         NaN         NaN
5         NaN         NaN         NaN

-観察、7行目のみが前の6行目で埋められます。 その後、行はそのまま残ります。

改名

rename()メソッドを使用すると、マッピング(dictまたはSeries)または任意の関数に基づいて軸のラベルを変更できます。

これを理解するために次の例を考えてみましょう-

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
print df1

print ("After renaming the rows and columns:")
print df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},
index = {0 : 'apple', 1 : 'banana', 2 : 'durian'})

その*出力*は次のとおりです-

         col1        col2        col3
0    0.486791    0.105759    1.540122
1   -0.990237    1.007885   -0.217896
2   -0.483855   -1.645027   -1.194113
3   -0.122316    0.566277   -0.366028
4   -0.231524   -0.721172   -0.112007
5    0.438810    0.000225    0.435479

After renaming the rows and columns:
                c1          c2        col3
apple     0.486791    0.105759    1.540122
banana   -0.990237    1.007885   -0.217896
durian   -0.483855   -1.645027   -1.194113
3        -0.122316    0.566277   -0.366028
4        -0.231524   -0.721172   -0.112007
5         0.438810    0.000225    0.435479

rename()メソッドは、 inplace という名前のパラメーターを提供します。このパラメーターはデフォルトでFalseであり、基になるデータをコピーします。 inplace = True を渡して、その場でデータの名前を変更します。

Pythonパンダ-反復

Pandasオブジェクトに対する基本的な反復の動作は、タイプによって異なります。 Seriesを反復処理する場合、それは配列のようなものと見なされ、基本的な反復処理によって値が生成されます。 DataFrameやPanelなどの他のデータ構造は、オブジェクトの keys を反復処理する* dictのような*規則に従います。

要するに、基本的な反復(オブジェクトの i の場合)は次を生成します-

  • シリーズ-値
  • DataFrame -列ラベル
  • パネル-アイテムのラベル

DataFrameの反復

DataFrameを反復すると、列名が与えられます。 同じことを理解するために、次の例を考えてみましょう。

import pandas as pd
import numpy as np

N=20
df = pd.DataFrame({
   'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
   'x': np.linspace(0,stop=N-1,num=N),
   'y': np.random.rand(N),
   'C': np.random.choice(['Low','Medium','High'],N).tolist(),
   'D': np.random.normal(100, 10, size=(N)).tolist()
   })

for col in df:
   print col

その*出力*は次のとおりです-

A
C
D
x
y

DataFrameの行を反復するには、次の関数を使用できます-

  • * iteritems()*-(キー、値)のペアを反復処理する
  • * iterrows()*-(インデックス、シリーズ)のペアとして行を反復処理する
  • * itertuples()*-namedtuplesとして行を反復処理します

iteritems()

各列をキーとして、値のペアをラベルとしてキー、列の値をシリーズオブジェクトとして繰り返します。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
for key,value in df.iteritems():
   print key,value

その*出力*は次のとおりです-

col1 0    0.802390
1    0.324060
2    0.256811
3    0.839186
Name: col1, dtype: float64

col2 0    1.624313
1   -1.033582
2    1.796663
3    1.856277
Name: col2, dtype: float64

col3 0   -0.022142
1   -0.230820
2    1.160691
3   -0.830279
Name: col3, dtype: float64

各列は、シリーズのキーと値のペアとして個別に繰り返されます。

iterrows()

iterrows()は、各インデックス値と各行のデータを含むシリーズを生成するイテレータを返します。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row_index,row in df.iterrows():
   print row_index,row

その*出力*は次のとおりです-

0  col1    1.529759
   col2    0.762811
   col3   -0.634691
Name: 0, dtype: float64

1  col1   -0.944087
   col2    1.420919
   col3   -0.507895
Name: 1, dtype: float64

2  col1   -0.077287
   col2   -0.858556
   col3   -0.663385
Name: 2, dtype: float64
3  col1    -1.638578
   col2     0.059866
   col3     0.493482
Name: 3, dtype: float64

-* iterrows()*は行を反復処理するため、行全体でデータ型を保持しません。 0,1,2は行インデックスであり、col1、col2、col3は列インデックスです。

itertuples()

itertuples()メソッドは、DataFrameの各行に対して名前付きタプルを生成する反復子を返します。 タプルの最初の要素は行の対応するインデックス値であり、残りの値は行の値です。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row in df.itertuples():
    print row

その*出力*は次のとおりです-

Pandas(Index=0, col1=1.5297586201375899, col2=0.76281127433814944, col3=-
0.6346908238310438)

Pandas(Index=1, col1=-0.94408735763808649, col2=1.4209186418359423, col3=-
0.50789517967096232)

Pandas(Index=2, col1=-0.07728664756791935, col2=-0.85855574139699076, col3=-
0.6633852507207626)

Pandas(Index=3, col1=0.65734942534106289, col2=-0.95057710432604969,
col3=0.80344487462316527)

注意-反復中はオブジェクトを変更しないでください。 反復は読み取りを目的としており、反復子は元のオブジェクト(ビュー)のコピーを返すため、変更は元のオブジェクトに反映されません。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])

for index, row in df.iterrows():
   row['a'] = 10
print df

その*出力*は次のとおりです-

        col1       col2       col3
0  -1.739815   0.735595  -0.295589
1   0.635485   0.106803   1.527922
2  -0.939064   0.547095   0.038585
3  -1.016509  -0.116580  -0.523158

観察、変更は反映されません。

Pythonパンダ-並べ替え

Pandasには2種類の並べ替えがあります。 彼らは-

  • ラベル別
  • 実際の値で

出力のある例を考えてみましょう。

import pandas as pd
import numpy as np

unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns=['col2','col1'])
print unsorted_df

その*出力*は次のとおりです-

        col2       col1
1  -2.063177   0.537527
4   0.142932  -0.684884
6   0.012667  -0.389340
2  -0.548797   1.848743
3  -1.044160   0.837381
5   0.385605   1.300185
9   1.031425  -1.002967
8  -0.407374  -0.435142
0   2.237453  -1.067139
7  -1.445831  -1.701035
*unsorted_df* では、 *labels* および *values* はソートされていません。 これらのソート方法を見てみましょう。

ラベル別

  • sort_index()*メソッドを使用して、軸の引数と並べ替えの順序を渡すことにより、DataFrameを並べ替えることができます。 デフォルトでは、ソートは行ラベルで昇順で実行されます。
import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
   mns = ['col2','col1'])

sorted_df=unsorted_df.sort_index()
print sorted_df

その*出力*は次のとおりです-

        col2       col1
0   0.208464   0.627037
1   0.641004   0.331352
2  -0.038067  -0.464730
3  -0.638456  -0.021466
4   0.014646  -0.737438
5  -0.290761  -1.669827
6  -0.797303  -0.018737
7   0.525753   1.628921
8  -0.567031   0.775951
9   0.060724  -0.322425

ソート順

ブール値を昇順パラメーターに渡すことにより、ソートの順序を制御できます。 同じことを理解するために、次の例を考えてみましょう。

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
   mns = ['col2','col1'])

sorted_df = unsorted_df.sort_index(ascending=False)
print sorted_df

その*出力*は次のとおりです-

         col2        col1
9    0.825697    0.374463
8   -1.699509    0.510373
7   -0.581378    0.622958
6   -0.202951    0.954300
5   -1.289321   -1.551250
4    1.302561    0.851385
3   -0.157915   -0.388659
2   -1.222295    0.166609
1    0.584890   -0.291048
0    0.668444   -0.061294

列を並べ替える

値0または1で軸引数を渡すことにより、列ラベルでソートを実行できます。 デフォルトでは、axis = 0で、行でソートされます。 同じことを理解するために、次の例を考えてみましょう。

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
   mns = ['col2','col1'])

sorted_df=unsorted_df.sort_index(axis=1)

print sorted_df

その*出力*は次のとおりです-

         col1        col2
1   -0.291048    0.584890
4    0.851385    1.302561
6    0.954300   -0.202951
2    0.166609   -1.222295
3   -0.388659   -0.157915
5   -1.551250   -1.289321
9    0.374463    0.825697
8    0.510373   -1.699509
0   -0.061294    0.668444
7    0.622958   -0.581378

値で

インデックスのソートと同様に、* sort_values()*は値でソートするためのメソッドです。 値を並べ替えるDataFrameの列名を使用する「by」引数を受け入れます。

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
   sorted_df = unsorted_df.sort_values(by='col1')

print sorted_df

その*出力*は次のとおりです-

   col1  col2
1    1    3
2    1    2
3    1    4
0    2    1

col1の値が並べ替えられ、それぞれのcol2の値と行インデックスがcol1とともに変化することに注意してください。 したがって、それらは分類されていないように見えます。

*'by'* 引数は列値のリストを取ります。
import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
   sorted_df = unsorted_df.sort_values(by=['col1','col2'])

print sorted_df

その*出力*は次のとおりです-

  col1 col2
2   1   2
1   1   3
3   1   4
0   2   1

ソートアルゴリズム

  • sort_values()*は、mergesort、heapsort、quicksortからアルゴリズムを選択するための規定を提供します。 Mergesortは唯一の安定したアルゴリズムです。
import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1' ,kind='mergesort')

print sorted_df

その*出力*は次のとおりです-

  col1 col2
1    1    3
2    1    2
3    1    4
0    2    1

Python Pandas-テキストデータの操作

この章では、基本的なシリーズ/インデックスを使用した文字列操作について説明します。 後続の章では、これらの文字列関数をDataFrameに適用する方法を学習します。

Pandasは、文字列データの操作を容易にする一連の文字列関数を提供します。 最も重要なことは、これらの関数は欠損/NaN値を無視(または除外)することです。

ほとんどの場合、これらのメソッドはすべてPython文字列関数で機能します(https://docs.python.org/3/library/stdtypesl#string-methodsを参照)。 そのため、SeriesオブジェクトをStringオブジェクトに変換してから、操作を実行します。

各操作の実行方法を見てみましょう。

Sr.No Function & Description
1

lower()

シリーズ/インデックスの文字列を小文字に変換します。

2

upper()

Series/Indexの文字列を大文字に変換します。

3

len()

String length()を計算します。

4

strip()

両側のSeries/indexの各文字列から空白(改行を含む)を取り除くのに役立ちます。

5

split(' ')

指定されたパターンで各文字列を分割します。

6

cat(sep=' ')

シリーズ/インデックス要素を指定されたセパレータで連結します。

7

get_dummies()

ワンホットエンコード値でDataFrameを返します。

8

contains(pattern)

部分文字列が要素に含まれる場合は各要素に対してブール値Trueを返し、そうでない場合はFalseを返します。

9

replace(a,b)

a を値 b に置き換えます。

10

repeat(value)

指定された回数で各要素を繰り返します。

11

count(pattern)

各要素のパターンの出現回数を返します。

12

startswith(pattern)

Series/Indexの要素がパターンで始まる場合、trueを返します。

13

endswith(pattern)

Series/Indexの要素がパターンで終わる場合、trueを返します。

14

find(pattern)

パターンが最初に現れる最初の位置を返します。

15

findall(pattern)

パターンのすべての出現のリストを返します。

16

swapcase

ケースの下部/上部を交換します。

17

islower()

シリーズ/インデックスの各文字列のすべての文字が小文字かどうかを確認します。 ブール値を返します

18

isupper()

Series/Indexの各文字列のすべての文字が大文字かどうかを確認します。 ブール値を返します。

19

isnumeric()

シリーズ/インデックスの各文字列のすべての文字が数値であるかどうかを確認します。 ブール値を返します。

ここでシリーズを作成し、上記のすべての機能がどのように機能するかを見てみましょう。

import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])

print s

その*出力*は次のとおりです-

0            Tom
1   William Rick
2           John
3        Alber@t
4            NaN
5           1234
6    Steve Smith
dtype: object

lower()

import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])

print s.str.lower()

その*出力*は次のとおりです-

0            tom
1   william rick
2           john
3        alber@t
4            NaN
5           1234
6    steve smith
dtype: object

アッパー()

import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])

print s.str.upper()

その*出力*は次のとおりです-

0            TOM
1   WILLIAM RICK
2           JOHN
3        ALBER@T
4            NaN
5           1234
6    STEVE SMITH
dtype: object

len()

import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.len()

その*出力*は次のとおりです-

0    3.0
1   12.0
2    4.0
3    7.0
4    NaN
5    4.0
6   10.0
dtype: float64

ストリップ()

import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After Stripping:")
print s.str.strip()

その*出力*は次のとおりです-

0            Tom
1   William Rick
2           John
3        Alber@t
dtype: object

After Stripping:
0            Tom
1   William Rick
2           John
3        Alber@t
dtype: object

split(パターン)

import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("Split Pattern:")
print s.str.split(' ')

その*出力*は次のとおりです-

0            Tom
1   William Rick
2           John
3        Alber@t
dtype: object

Split Pattern:
0   [Tom, , , , , , , , , , ]
1   [, , , , , William, Rick]
2   [John]
3   [Alber@t]
dtype: object

cat(sep = pattern)

import pandas as pd
import numpy as np

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.cat(sep='_')

その*出力*は次のとおりです-

Tom _ William Rick_John_Alber@t

get_dummies()

import pandas as pd
import numpy as np

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.get_dummies()

その*出力*は次のとおりです-

   William Rick   Alber@t   John   Tom
0             0         0      0     1
1             1         0      0     0
2             0         0      1     0
3             0         1      0     0

含む()

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.contains(' ')

その*出力*は次のとおりです-

0   True
1   True
2   False
3   False
dtype: bool

replace(a、b)

import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After replacing @ with $:")
print s.str.replace('@','$')

その*出力*は次のとおりです-

0   Tom
1   William Rick
2   John
3   Alber@t
dtype: object

After replacing @ with $:
0   Tom
1   William Rick
2   John
3   Alber$t
dtype: object

繰り返し(値)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.repeat(2)

その*出力*は次のとおりです-

0   Tom            Tom
1   William Rick   William Rick
2                  JohnJohn
3                  Alber@tAlber@t
dtype: object

カウント(パターン)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print ("The number of 'm's in each string:")
print s.str.count('m')

その*出力*は次のとおりです-

The number of 'm's in each string:
0    1
1    1
2    0
3    0

startswith(パターン)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print ("Strings that start with 'T':")
print s.str. startswith ('T')

その*出力*は次のとおりです-

0  True
1  False
2  False
3  False
dtype: bool

endswith(パターン)

import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("Strings that end with 't':")
print s.str.endswith('t')

その*出力*は次のとおりです-

Strings that end with 't':
0  False
1  False
2  False
3  True
dtype: bool

find(パターン)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.find('e')

その*出力*は次のとおりです-

0  -1
1  -1
2  -1
3   3
dtype: int64

「-1」は、そのようなパターンが要素にないことを示します。

findall(パターン)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.findall('e')

その*出力*は次のとおりです-

0 []
1 []
2 []
3 [e]
dtype: object

Null list([])は、要素にそのようなパターンが存在しないことを示します。

swapcase()

import pandas as pd

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.swapcase()

その*出力*は次のとおりです-

0  tOM
1  wILLIAM rICK
2  jOHN
3  aLBER@T
dtype: object

islower()

import pandas as pd

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.islower()

その*出力*は次のとおりです-

0  False
1  False
2  False
3  False
dtype: bool

isupper()

import pandas as pd

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])

print s.str.isupper()

その*出力*は次のとおりです-

0  False
1  False
2  False
3  False
dtype: bool

isnumeric()

import pandas as pd

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])

print s.str.isnumeric()

その*出力*は次のとおりです-

0  False
1  False
2  False
3  False
dtype: bool

Python Pandas-オプションとカスタマイズ

パンダは、その動作のいくつかの側面をカスタマイズするためのAPIを提供し、ディスプレイが主に使用されています。

APIは、5つの関連する機能で構成されています。 彼らは-

  • get_option()
  • set_option()
  • reset_option()
  • describe_option()
  • option_context()

関数がどのように動作するかを理解しましょう。

get_option(param)

get_optionは単一のパラメータを取り、以下の出力で与えられた値を返します-

display.max_rows

値のデフォルト数を表示します。 通訳者はこの値を読み取り、表示する上限としてこの値を持つ行を表示します。

import pandas as pd
print pd.get_option("display.max_rows")

その*出力*は次のとおりです-

60

display.max_columns

値のデフォルト数を表示します。 通訳者はこの値を読み取り、表示する上限としてこの値を持つ行を表示します。

import pandas as pd
print pd.get_option("display.max_columns")

その*出力*は次のとおりです-

20

ここで、60および20はデフォルトの構成パラメーター値です。

set_option(param、value)

set_optionは2つの引数を取り、以下に示すようにパラメータに値を設定します-

display.max_rows

  • set_option()*を使用して、表示するデフォルトの行数を変更できます。
import pandas as pd

pd.set_option("display.max_rows",80)

print pd.get_option("display.max_rows")

その*出力*は次のとおりです-

80

display.max_columns

  • set_option()*を使用して、表示するデフォルトの行数を変更できます。
import pandas as pd

pd.set_option("display.max_columns",30)

print pd.get_option("display.max_columns")

その*出力*は次のとおりです-

30

reset_option(param)

*reset_option* は引数を取り、値をデフォルト値に戻します。

display.max_rows

reset_option()を使用して、表示するデフォルトの行数に戻すことができます。

import pandas as pd

pd.reset_option("display.max_rows")
print pd.get_option("display.max_rows")

その*出力*は次のとおりです-

60

describe_option(param)

*describe_option* は引数の説明を出力します。

display.max_rows

reset_option()を使用して、表示するデフォルトの行数に戻すことができます。

import pandas as pd
pd.describe_option("display.max_rows")

その*出力*は次のとおりです-

display.max_rows : int
   If max_rows is exceeded, switch to truncate view. Depending on
   'large_repr', objects are either centrally truncated or printed as
   a summary view. 'None' value means unlimited.

   In case python/IPython is running in a terminal and `large_repr`
   equals 'truncate' this can be set to 0 and pandas will auto-detect
   the height of the terminal and print a truncated object which fits
   the screen height. The IPython notebook, IPython qtconsole, or
   IDLE do not run in a terminal and hence it is not possible to do
   correct auto-detection.
   [default: 60] [currently: 60]

option_context()

option_contextコンテキストマネージャーは、* withステートメント*でオプションを一時的に設定するために使用されます。 with block を終了すると、オプション値は自動的に復元されます-

display.max_rows

option_context()を使用して、値を一時的に設定できます。

import pandas as pd
with pd.option_context("display.max_rows",10):
   print(pd.get_option("display.max_rows"))
   print(pd.get_option("display.max_rows"))

その*出力*は次のとおりです-

10
10

1番目と2番目のprintステートメントの違いを参照してください。 最初のステートメントは、 with_context 自体の内部で一時的な* option_context()によって設定された値を出力します。 *with context の後、2番目のprintステートメントは設定された値を出力します。

よく使用されるパラメーター

Sr.No Parameter & Description
1

display.max_rows

表示する最大行数を表示します

2

2 display.max_columns

表示する列の最大数を表示します

3

display.expand_frame_repr

ページをストレッチするためのデータフレームを表示します

4

display.max_colwidth

最大列幅を表示します

5

display.precision

10進数の精度を表示します

Python Pandas-データのインデックス作成と選択

この章では、日付を切り刻み、パンダオブジェクトのサブセットを取得する方法について説明します。

PythonおよびNumPyのインデックス演算子「[]」および属性演算子「。」幅広いユースケースでPandasデータ構造にすばやく簡単にアクセスできます。 ただし、アクセスするデータのタイプは事前にはわからないため、標準演算子を直接使用すると最適化の制限がいくつかあります。 本番コードの場合、この章で説明する最適化されたパンダデータアクセス方法を利用することをお勧めします。

パンダは現在、3種類のマルチ軸インデックスをサポートしています。 3つのタイプは、次の表に記載されています-

Sr.No Indexing & Description
1

.loc()

ラベルベース

2

.iloc()

整数ベース

3

.ix()

ラベルと整数ベースの両方

.loc()

パンダは、純粋に*ラベルベースのインデックス作成*を行うためのさまざまな方法を提供します。 スライスするとき、開始境界も含まれます。 整数は有効なラベルですが、位置ではなくラベルを参照します。

  • .loc()*には複数のアクセス方法があります-

  • 単一のスカラーラベル

  • ラベルのリスト

  • スライスオブジェクト

  • ブール配列

    *loc* は、「、」で区切られた2つのsingle/list/range演算子を取ります。 最初の行は行を示し、2番目の行は列を示します。

例1

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

#select all rows for a specific column
print df.loc[:,'A']

その*出力*は次のとおりです-

a   0.391548
b  -0.070649
c  -0.317212
d  -2.162406
e   2.202797
f   0.613709
g   1.050559
h   1.122680
Name: A, dtype: float64

例2

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select all rows for multiple columns, say list[]
print df.loc[:,['A','C']]

その*出力*は次のとおりです-

            A           C
a    0.391548    0.745623
b   -0.070649    1.620406
c   -0.317212    1.448365
d   -2.162406   -0.873557
e    2.202797    0.528067
f    0.613709    0.286414
g    1.050559    0.216526
h    1.122680   -1.621420

実施例3

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select few rows for multiple columns, say list[]
print df.loc[[a','b','f','h'],['A','C']]

その*出力*は次のとおりです-

           A          C
a   0.391548   0.745623
b  -0.070649   1.620406
f   0.613709   0.286414
h   1.122680  -1.621420

実施例4

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select range of rows for all columns
print df.loc['a':'h']

その*出力*は次のとおりです-

            A           B          C          D
a    0.391548   -0.224297   0.745623   0.054301
b   -0.070649   -0.880130   1.620406   1.419743
c   -0.317212   -1.929698   1.448365   0.616899
d   -2.162406    0.614256  -0.873557   1.093958
e    2.202797   -2.315915   0.528067   0.612482
f    0.613709   -0.157674   0.286414  -0.500517
g    1.050559   -2.272099   0.216526   0.928449
h    1.122680    0.324368  -1.621420  -0.741470

実施例5

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# for getting values with a boolean array
print df.loc['a']>0

その*出力*は次のとおりです-

A  False
B  True
C  False
D  False
Name: a, dtype: bool

.iloc()

パンダは、純粋に整数ベースのインデックスを取得するためにさまざまなメソッドを提供します。 pythonやnumpyと同様に、これらは* 0ベースのインデックスです。

さまざまなアクセス方法は次のとおりです-

  • 整数
  • 整数のリスト
  • 値の範囲

例1

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# select all rows for a specific column
print df.iloc[:4]

その*出力*は次のとおりです-

           A          B           C           D
0   0.699435   0.256239   -1.270702   -0.645195
1  -0.685354   0.890791   -0.813012    0.631615
2  -0.783192  -0.531378    0.025070    0.230806
3   0.539042  -1.284314    0.826977   -0.026251

例2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Integer slicing
print df.iloc[:4]
print df.iloc[1:5, 2:4]

その*出力*は次のとおりです-

           A          B           C           D
0   0.699435   0.256239   -1.270702   -0.645195
1  -0.685354   0.890791   -0.813012    0.631615
2  -0.783192  -0.531378    0.025070    0.230806
3   0.539042  -1.284314    0.826977   -0.026251

           C          D
1  -0.813012   0.631615
2   0.025070   0.230806
3   0.826977  -0.026251
4   1.423332   1.130568

実施例3

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Slicing through list of values
print df.iloc[[print df.iloc[1:3, :]
print df.iloc[:,1:3]

その*出力*は次のとおりです-

           B           D
1   0.890791    0.631615
3  -1.284314   -0.026251
5  -0.512888   -0.518930

           A           B           C           D
1  -0.685354    0.890791   -0.813012    0.631615
2  -0.783192   -0.531378    0.025070    0.230806

           B           C
0   0.256239   -1.270702
1   0.890791   -0.813012
2  -0.531378    0.025070
3  -1.284314    0.826977
4  -0.460729    1.423332
5  -0.512888    0.581409
6  -1.204853    0.098060
7  -0.947857    0.641358

.ix()

Pandasは、純粋なラベルベースと整数ベースに加えて、.ix()演算子を使用してオブジェクトを選択およびサブセット化するハイブリッドメソッドを提供します。

例1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Integer slicing
print df.ix[:4]

その*出力*は次のとおりです-

           A          B           C           D
0   0.699435   0.256239   -1.270702   -0.645195
1  -0.685354   0.890791   -0.813012    0.631615
2  -0.783192  -0.531378    0.025070    0.230806
3   0.539042  -1.284314    0.826977   -0.026251

例2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Index slicing
print df.ix[:,'A']

その*出力*は次のとおりです-

0   0.699435
1  -0.685354
2  -0.783192
3   0.539042
4  -1.044209
5  -1.415411
6   1.062095
7   0.994204
Name: A, dtype: float64

表記法の使用

Multi-axesインデックスを使用してPandasオブジェクトから値を取得するには、次の表記法を使用します-

Object Indexers Return Type
Series s.loc[indexer] Scalar value
DataFrame df.loc[row_index,col_index] Series object
Panel p.loc[item_index,major_index, minor_index] p.loc[item_index,major_index, minor_index]
  • 注意-.iloc()&.ix()*は、同じインデックスオプションと戻り値を適用します。

DataFrameオブジェクトで各操作を実行する方法を見てみましょう。 基本的なインデックス演算子「[]」を使用します-

例1

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df['A']

その*出力*は次のとおりです-

0  -0.478893
1   0.391931
2   0.336825
3  -1.055102
4  -0.165218
5  -0.328641
6   0.567721
7  -0.759399
Name: A, dtype: float64

注意-値のリストを[]に渡して、それらの列を選択できます。

例2

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

print df[[A','B']]

その*出力*は次のとおりです-

           A           B
0  -0.478893   -0.606311
1   0.391931   -0.949025
2   0.336825    0.093717
3  -1.055102   -0.012944
4  -0.165218    1.550310
5  -0.328641   -0.226363
6   0.567721   -0.312585
7  -0.759399   -0.372696

実施例3

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df[2:2]

その*出力*は次のとおりです-

Columns: [A, B, C, D]
Index: []

属性アクセス

列は、属性演算子「。」を使用して選択できます。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

print df.A

その*出力*は次のとおりです-

0   -0.478893
1    0.391931
2    0.336825
3   -1.055102
4   -0.165218
5   -0.328641
6    0.567721
7   -0.759399
Name: A, dtype: float64

Pythonパンダ-統計関数

統計的手法は、データの動作の理解と分析に役立ちます。 ここで、Pandasオブジェクトに適用できるいくつかの統計関数を学習します。

変化率

シリーズ、DatFrames、およびパネルには、すべて* pct_change()*関数があります。 この関数は、すべての要素をその前の要素と比較し、変化率を計算します。

import pandas as pd
import numpy as np
s = pd.Series([1,2,3,4,5,4])
print s.pct_change()

df = pd.DataFrame(np.random.randn(5, 2))
print df.pct_change()

その*出力*は次のとおりです-

0        NaN
1   1.000000
2   0.500000
3   0.333333
4   0.250000
5  -0.200000
dtype: float64

            0          1
0         NaN        NaN
1  -15.151902   0.174730
2  -0.746374   -1.449088
3  -3.582229   -3.165836
4   15.601150  -1.860434

デフォルトでは、* pct_change()は列に対して機能します。同じ行を適用する場合は、 axis = 1()*引数を使用します。

共分散

共分散は系列データに適用されます。 Seriesオブジェクトには、シリーズオブジェクト間の共分散を計算するメソッドcovがあります。 NAは自動的に除外されます。

Covシリーズ

import pandas as pd
import numpy as np
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print s1.cov(s2)

その*出力*は次のとおりです-

-0.12978405324

DataFrameに適用された共分散法は、すべての列間で cov を計算します。

import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print frame['a'].cov(frame['b'])
print frame.cov()

その*出力*は次のとおりです-

-0.58312921152741437

           a           b           c           d            e
a   1.780628   -0.583129   -0.185575    0.003679    -0.136558
b  -0.583129    1.297011    0.136530   -0.523719     0.251064
c  -0.185575    0.136530    0.915227   -0.053881    -0.058926
d   0.003679   -0.523719   -0.053881    1.521426    -0.487694
e  -0.136558    0.251064   -0.058926   -0.487694     0.960761

-最初のステートメントの ab 列の間の cov を観察します。これは、DataFrameのcovによって返される値です。

相関

相関関係は、任意の2つの値の配列(系列)の間の線形関係を示しています。 ピアソン(デフォルト)、スピアマン、ケンドールなど、相関を計算する方法は複数あります。

import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])

print frame['a'].corr(frame['b'])
print frame.corr()

その*出力*は次のとおりです-

-0.383712785514

           a          b          c          d           e
a   1.000000  -0.383713  -0.145368   0.002235   -0.104405
b  -0.383713   1.000000   0.125311  -0.372821    0.224908
c  -0.145368   0.125311   1.000000  -0.045661   -0.062840
d   0.002235  -0.372821  -0.045661   1.000000   -0.403380
e  -0.104405   0.224908  -0.062840  -0.403380    1.000000

DataFrameに数値以外の列がある場合、自動的に除外されます。

データランキング

データのランキングは、要素の配列内の各要素のランキングを生成します。 同順位の場合、平均ランクを割り当てます。

import pandas as pd
import numpy as np

s = pd.Series(np.random.np.random.randn(5), index=list('abcde'))
s['d'] = s['b'] # so there's a tie
print s.rank()

その*出力*は次のとおりです-

a  1.0
b  3.5
c  2.0
d  3.5
e  5.0
dtype: float64

ランクは、オプションで、デフォルトでtrueであるパラメータの昇順を取ります。 falseの場合、データは逆ランク付けされ、値が大きいほど小さいランクが割り当てられます。

ランクは、メソッドパラメータで指定されたさまざまなタイブレークメソッドをサポートしています-

  • 平均-同順位グループの平均ランク
  • min -グループ内の最低ランク
  • max -グループ内の最高ランク
  • first -配列に現れる順序で割り当てられたランク

Pythonパンダ-ウィンドウ関数

Pandasは、数値データを扱うために、ウィンドウ統計の重みをローリング、拡張、指数関数的に移動するなど、いくつかのバリエーションを提供します。 これらには、合計、平均、中央値、分散、共分散、相関などがあります

次に、これらのそれぞれをDataFrameオブジェクトに適用する方法を学習します。

.rolling()関数

この関数は、一連のデータに適用できます。 window = n 引数を指定し、その上に適切な統計関数を適用します。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.rolling(window=3).mean()

その*出力*は次のとおりです-

                    A           B           C           D
2000-01-01        NaN         NaN         NaN         NaN
2000-01-02        NaN         NaN         NaN         NaN
2000-01-03   0.434553   -0.667940   -1.051718   -0.826452
2000-01-04   0.628267   -0.047040   -0.287467   -0.161110
2000-01-05   0.398233    0.003517    0.099126   -0.405565
2000-01-06   0.641798    0.656184   -0.322728    0.428015
2000-01-07   0.188403    0.010913   -0.708645    0.160932
2000-01-08   0.188043   -0.253039   -0.818125   -0.108485
2000-01-09   0.682819   -0.606846   -0.178411   -0.404127
2000-01-10   0.688583    0.127786    0.513832   -1.067156

-ウィンドウサイズは3であるため、最初の2つの要素にはnullがあり、3番目以降の値は nn-1 、および n-2 要素の平均になります。 したがって、前述のさまざまな機能を適用することもできます。

.expanding()関数

この関数は、一連のデータに適用できます。 min_periods = n 引数を指定し、その上に適切な統計関数を適用します。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.expanding(min_periods=3).mean()

その*出力*は次のとおりです-

                   A           B           C           D
2000-01-01        NaN         NaN         NaN         NaN
2000-01-02        NaN         NaN         NaN         NaN
2000-01-03   0.434553   -0.667940   -1.051718   -0.826452
2000-01-04   0.743328   -0.198015   -0.852462   -0.262547
2000-01-05   0.614776   -0.205649   -0.583641   -0.303254
2000-01-06   0.538175   -0.005878   -0.687223   -0.199219
2000-01-07   0.505503   -0.108475   -0.790826   -0.081056
2000-01-08   0.454751   -0.223420   -0.671572   -0.230215
2000-01-09   0.586390   -0.206201   -0.517619   -0.267521
2000-01-10   0.560427   -0.037597   -0.399429   -0.376886

.ewm()関数

*ewm* は一連のデータに適用されます。 com、span、 *halflife* 引数のいずれかを指定し、その上に適切な統計関数を適用します。 重みを指数関数的に割り当てます。
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.ewm(com=0.5).mean()

その*出力*は次のとおりです-

                    A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   0.865131   -0.453626   -1.137961    0.058747
2000-01-03  -0.132245   -0.807671   -0.308308   -1.491002
2000-01-04   1.084036    0.555444   -0.272119    0.480111
2000-01-05   0.425682    0.025511    0.239162   -0.153290
2000-01-06   0.245094    0.671373   -0.725025    0.163310
2000-01-07   0.288030   -0.259337   -1.183515    0.473191
2000-01-08   0.162317   -0.771884   -0.285564   -0.692001
2000-01-09   1.147156   -0.302900    0.380851   -0.607976
2000-01-10   0.600216    0.885614    0.569808   -1.110113

ウィンドウ関数は、曲線を平滑化することにより、データ内の傾向をグラフィカルに見つけるのに主に使用されます。 毎日のデータに多くの変動があり、多くのデータポイントが利用できる場合、サンプルを取得してプロットすることは1つの方法であり、ウィンドウ計算を適用して結果にグラフをプロットすることは別の方法です。 これらの方法により、曲線または傾向を滑らかにすることができます。

Pythonパンダ-集約

ローリング、エキスパンド、および ewm オブジェクトが作成されると、いくつかの方法を使用してデータの集計を実行できます。

DataFrameでの集計の適用

DataFrameを作成し、その上に集計を適用してみましょう。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])

print df
r = df.rolling(window=3,min_periods=1)
print r

その*出力*は次のとおりです-

                    A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   0.790670   -0.387854   -0.668132    0.267283
2000-01-03  -0.575523   -0.965025    0.060427   -2.179780
2000-01-04   1.669653    1.211759   -0.254695    1.429166
2000-01-05   0.100568   -0.236184    0.491646   -0.466081
2000-01-06   0.155172    0.992975   -1.205134    0.320958
2000-01-07   0.309468   -0.724053   -1.412446    0.627919
2000-01-08   0.099489   -1.028040    0.163206   -1.274331
2000-01-09   1.639500   -0.068443    0.714008   -0.565969
2000-01-10   0.326761    1.479841    0.664282   -1.361169

Rolling [window=3,min_periods=1,center=False,axis=0]

関数をDataFrame全体に渡すか、標準の get item メソッドを使用して列を選択することで集計できます。

データフレーム全体に集計を適用する

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate(np.sum)

その*出力*は次のとおりです-

                    A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469

                    A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469

データフレームの単一の列に集計を適用する

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate(np.sum)

その*出力*は次のとおりです-

                 A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
2000-01-01   1.088512
2000-01-02   1.879182
2000-01-03   1.303660
2000-01-04   1.884801
2000-01-05   1.194699
2000-01-06   1.925393
2000-01-07   0.565208
2000-01-08   0.564129
2000-01-09   2.048458
2000-01-10   2.065750
Freq: D, Name: A, dtype: float64

DataFrameの複数の列に集計を適用する

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[[A','B']].aggregate(np.sum)

その*出力*は次のとおりです-

                 A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
                    A           B
2000-01-01   1.088512   -0.650942
2000-01-02   1.879182   -1.038796
2000-01-03   1.303660   -2.003821
2000-01-04   1.884801   -0.141119
2000-01-05   1.194699    0.010551
2000-01-06   1.925393    1.968551
2000-01-07   0.565208    0.032738
2000-01-08   0.564129   -0.759118
2000-01-09   2.048458   -1.820537
2000-01-10   2.065750    0.383357

DataFrameの単一の列に複数の関数を適用する

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate([np.sum,np.mean])

その*出力*は次のとおりです-

                 A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
                  sum       mean
2000-01-01   1.088512   1.088512
2000-01-02   1.879182   0.939591
2000-01-03   1.303660   0.434553
2000-01-04   1.884801   0.628267
2000-01-05   1.194699   0.398233
2000-01-06   1.925393   0.641798
2000-01-07   0.565208   0.188403
2000-01-08   0.564129   0.188043
2000-01-09   2.048458   0.682819
2000-01-10   2.065750   0.688583

DataFrameの複数の列に複数の関数を適用する

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[[A','B']].aggregate([np.sum,np.mean])

その*出力*は次のとおりです-

                 A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
                    A                      B
                  sum       mean         sum        mean
2000-01-01   1.088512   1.088512   -0.650942   -0.650942
2000-01-02   1.879182   0.939591   -1.038796   -0.519398
2000-01-03   1.303660   0.434553   -2.003821   -0.667940
2000-01-04   1.884801   0.628267   -0.141119   -0.047040
2000-01-05   1.194699   0.398233    0.010551    0.003517
2000-01-06   1.925393   0.641798    1.968551    0.656184
2000-01-07   0.565208   0.188403    0.032738    0.010913
2000-01-08   0.564129   0.188043   -0.759118   -0.253039
2000-01-09   2.048458   0.682819   -1.820537   -0.606846
2000-01-10   2.065750   0.688583    0.383357    0.127786

データフレームの異なる列に異なる関数を適用する

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(3, 4),
   index = pd.date_range('1/1/2000', periods=3),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate({'A' : np.sum,'B' : np.mean})

その*出力*は次のとおりです-

                    A          B          C         D
2000-01-01  -1.575749  -1.018105   0.317797  0.545081
2000-01-02  -0.164917  -1.361068   0.258240  1.113091
2000-01-03   1.258111   1.037941  -0.047487  0.867371
                    A          B
2000-01-01  -1.575749  -1.018105
2000-01-02  -1.740666  -1.189587
2000-01-03  -0.482555  -0.447078

Pythonパンダ-欠落データ

現実のシナリオでは、データの欠落は常に問題です。 機械学習やデータマイニングなどの分野は、欠損値が原因でデータの品質が低下するため、モデル予測の精度に重大な問題があります。 これらの領域では、欠損値の処理がモデルをより正確かつ有効にするための主要な焦点です。

データが欠落するタイミングと理由

製品のオンライン調査について考えてみましょう。 多くの場合、人々は自分に関連するすべての情報を共有しません。 経験を共有している人はほとんどいませんが、製品を使用している期間はありません。製品を使用している期間、経験は共有しているが、連絡先情報は共有していない人はほとんどいません。 したがって、何らかの方法でデータの一部が常に欠落しています。これはリアルタイムでは非常に一般的です。

パンダを使用して欠損値(NAやNaNなど)を処理する方法を見てみましょう。

# import the pandas library
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df

その*出力*は次のとおりです-

         one        two      three
a   0.077988   0.476149   0.965836
b        NaN        NaN        NaN
c  -0.390208  -0.551605  -2.301950
d        NaN        NaN        NaN
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g        NaN        NaN        NaN
h   0.085100   0.532791   0.887415

インデックスの再作成を使用して、欠損値のあるDataFrameを作成しました。 出力では、 NaN は* Not a Number。*を意味します。

欠損値の確認

欠損値の検出を容易にするため(および異なる配列dtype全体)、PandasはSeriesおよびDataFrameオブジェクトのメソッドでもある* isnull()および notnull()*関数を提供します-

例1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df['one'].isnull()

その*出力*は次のとおりです-

a  False
b  True
c  False
d  True
e  False
f  False
g  True
h  False
Name: one, dtype: bool

例2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df['one'].notnull()

その*出力*は次のとおりです-

a  True
b  False
c  True
d  False
e  True
f  True
g  False
h  True
Name: one, dtype: bool

欠損データを含む計算

  • データを合計する場合、NAはゼロとして扱われます
  • データがすべてNAの場合、結果はNAになります

例1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df['one'].sum()

その*出力*は次のとおりです-

2.02357685917

例2

import pandas as pd
import numpy as np

df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()

その*出力*は次のとおりです-

nan

欠損データのクリーニング/充填

パンダは、欠損値をクリーニングするためのさまざまな方法を提供します。 fillna関数は、次のセクションで説明したように、いくつかの方法でNA値に非NULLデータを「埋める」ことができます。

NaNをスカラー値に置き換える

次のプログラムは、「NaN」を「0」に置き換える方法を示しています。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])

df = df.reindex(['a', 'b', 'c'])

print df
print ("NaN replaced with '0':")
print df.fillna(0)

その*出力*は次のとおりです-

         one        two     three
a  -0.576991  -0.741695  0.553172
b        NaN        NaN       NaN
c   0.744328  -1.735166  1.749580

NaN replaced with '0':
         one        two     three
a  -0.576991  -0.741695  0.553172
b   0.000000   0.000000  0.000000
c   0.744328  -1.735166  1.749580

ここでは、値ゼロで埋めています。代わりに、他の値を入力することもできます。

NAを前後に埋める

ReIndexingの章で説明した充填の概念を使用して、欠損値を充填します。

Sr.No Method & Action
1

pad/fill

塗りつぶしメソッド

2

bfill/backfill

塗りつぶしメソッド

例1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df.fillna(method='pad')

その*出力*は次のとおりです-

         one        two      three
a   0.077988   0.476149   0.965836
b   0.077988   0.476149   0.965836
c  -0.390208  -0.551605  -2.301950
d  -0.390208  -0.551605  -2.301950
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g  -0.930230  -0.670473   1.146615
h   0.085100   0.532791   0.887415

例2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df.fillna(method='backfill')

その*出力*は次のとおりです-

         one        two      three
a   0.077988   0.476149   0.965836
b  -0.390208  -0.551605  -2.301950
c  -0.390208  -0.551605  -2.301950
d  -2.000303  -0.788201   1.510072
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g   0.085100   0.532791   0.887415
h   0.085100   0.532791   0.887415

欠損値を削除

欠損値を単純に除外したい場合は、 axis 引数と共に dropna 関数を使用します。 デフォルトでは、axis = 0、つまり行に沿っています。つまり、行内の値がNAの場合、行全体が除外されます。

例1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()

その*出力*は次のとおりです-

         one        two      three
a   0.077988   0.476149   0.965836
c  -0.390208  -0.551605  -2.301950
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
h   0.085100   0.532791   0.887415

例2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna(axis=1)

その*出力*は次のとおりです-

Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]

欠落している(または)汎用値を置換する

多くの場合、一般的な値を特定の値に置き換える必要があります。 replaceメソッドを適用することでこれを実現できます。

NAをスカラー値に置き換えることは、* fillna()*関数と同等の動作です。

例1

import pandas as pd
import numpy as np

df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})

print df.replace({1000:10,2000:60})

その*出力*は次のとおりです-

   one  two
0   10   10
1   20    0
2   30   30
3   40   40
4   50   50
5   60   60

例2

import pandas as pd
import numpy as np

df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})

その*出力*は次のとおりです-

   one  two
0   10   10
1   20    0
2   30   30
3   40   40
4   50   50
5   60   60

Pythonパンダ-GroupBy

*groupby* 操作には、元のオブジェクトに対する次の操作のいずれかが含まれます。 彼らは-
  • *分割*オブジェクト
  • *適用*関数
  • 結果を組み合わせる

多くの場合、データをセットに分割し、各サブセットにいくつかの機能を適用します。 適用機能では、次の操作を実行できます-

  • 集計-要約統計量の計算
  • 変換-いくつかのグループ固有の操作を実行します
  • フィルター-何らかの条件でデータを破棄する

ここでDataFrameオブジェクトを作成し、そのすべての操作を実行しましょう-

#import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df

その*出力*は次のとおりです-

    Points   Rank     Team   Year
0      876      1   Riders   2014
1      789      2   Riders   2015
2      863      2   Devils   2014
3      673      3   Devils   2015
4      741      3    Kings   2014
5      812      4    kings   2015
6      756      1    Kings   2016
7      788      1    Kings   2017
8      694      2   Riders   2016
9      701      4   Royals   2014
10     804      1   Royals   2015
11     690      2   Riders   2017

データをグループに分割する

パンダオブジェクトは、任意のオブジェクトに分割できます。 のようなオブジェクトを分割する複数の方法があります-

  • obj.groupby( 'key')
  • obj.groupby(['key1'、 'key2'])
  • obj.groupby(key、axis = 1)

グループ化オブジェクトをDataFrameオブジェクトに適用する方法を見てみましょう

# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df.groupby('Team')

その*出力*は次のとおりです-

<pandas.core.groupby.DataFrameGroupBy object at 0x7fa46a977e50>

グループを表示

# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df.groupby('Team').groups

その*出力*は次のとおりです-

{'Kings': Int64Index([4, 6, 7],      dtype='int64'),
'Devils': Int64Index([2, 3],         dtype='int64'),
'Riders': Int64Index([0, 1, 8, 11],  dtype='int64'),
'Royals': Int64Index([9, 10],        dtype='int64'),
'kings' : Int64Index([5],            dtype='int64')}

  • 複数の列を持つ*でグループ化-
# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df.groupby(['Team','Year']).groups

その*出力*は次のとおりです-

{('Kings', 2014): Int64Index([4], dtype='int64'),
 ('Royals', 2014): Int64Index([9], dtype='int64'),
 ('Riders', 2014): Int64Index([0], dtype='int64'),
 ('Riders', 2015): Int64Index([1], dtype='int64'),
 ('Kings', 2016): Int64Index([6], dtype='int64'),
 ('Riders', 2016): Int64Index([8], dtype='int64'),
 ('Riders', 2017): Int64Index([11], dtype='int64'),
 ('Devils', 2014): Int64Index([2], dtype='int64'),
 ('Devils', 2015): Int64Index([3], dtype='int64'),
 ('kings', 2015): Int64Index([5], dtype='int64'),
 ('Royals', 2015): Int64Index([10], dtype='int64'),
 ('Kings', 2017): Int64Index([7], dtype='int64')}

グループを反復処理する

*groupby* オブジェクトを手にすると、itertools.objに似たオブジェクトを反復処理できます。
# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Year')

for name,group in grouped:
   print name
   print group

その*出力*は次のとおりです-

2014
   Points  Rank     Team   Year
0     876     1   Riders   2014
2     863     2   Devils   2014
4     741     3   Kings    2014
9     701     4   Royals   2014

2015
   Points  Rank     Team   Year
1     789     2   Riders   2015
3     673     3   Devils   2015
5     812     4    kings   2015
10    804     1   Royals   2015

2016
   Points  Rank     Team   Year
6     756     1    Kings   2016
8     694     2   Riders   2016

2017
   Points  Rank    Team   Year
7     788     1   Kings   2017
11    690     2  Riders   2017

デフォルトでは、 groupby オブジェクトのラベル名はグループ名と同じです。

グループを選択

  • get_group()*メソッドを使用して、単一のグループを選択できます。
# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Year')
print grouped.get_group(2014)

その*出力*は次のとおりです-

   Points  Rank     Team    Year
0     876     1   Riders    2014
2     863     2   Devils    2014
4     741     3   Kings     2014
9     701     4   Royals    2014

集計

集約関数は、グループごとに1つの集約値を返します。 group by オブジェクトが作成されると、グループ化されたデータに対していくつかの集計操作を実行できます。

明らかなものは、集計または同等の agg メソッドによる集計です-

# import the pandas library
import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Year')
print grouped['Points'].agg(np.mean)

その*出力*は次のとおりです-

Year
2014   795.25
2015   769.50
2016   725.00
2017   739.00
Name: Points, dtype: float64

各グループのサイズを確認する別の方法は、size()関数を適用することです-

import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

Attribute Access in Python Pandas
grouped = df.groupby('Team')
print grouped.agg(np.size)

その*出力*は次のとおりです-

         Points   Rank   Year
Team
Devils        2      2      2
Kings         3      3      3
Riders        4      4      4
Royals        2      2      2
kings         1      1      1

複数の集約関数を一度に適用する

グループ化されたシリーズでは、 list または dict of functions を渡して集約を行い、DataFrameを出力として生成することもできます-

# import the pandas library
import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Team')
print grouped['Points'].agg([np.sum, np.mean, np.std])

その*出力*は次のとおりです-

Team      sum      mean          std
Devils   1536   768.000000   134.350288
Kings    2285   761.666667    24.006943
Riders   3049   762.250000    88.567771
Royals   1505   752.500000    72.831998
kings     812   812.000000          NaN

変換

グループまたは列の変換は、グループ化されているものと同じサイズのインデックスが付けられたオブジェクトを返します。 したがって、変換は、グループチャンクのサイズと同じサイズの結果を返す必要があります。

# import the pandas library
import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Team')
score = lambda x: (x - x.mean())/x.std()*10
print grouped.transform(score)

その*出力*は次のとおりです-

       Points        Rank        Year
0   12.843272  -15.000000  -11.618950
1   3.020286     5.000000   -3.872983
2   7.071068    -7.071068   -7.071068
3  -7.071068     7.071068    7.071068
4  -8.608621    11.547005  -10.910895
5        NaN          NaN         NaN
6  -2.360428    -5.773503    2.182179
7  10.969049    -5.773503    8.728716
8  -7.705963     5.000000    3.872983
9  -7.071068     7.071068   -7.071068
10  7.071068    -7.071068    7.071068
11 -8.157595     5.000000   11.618950

濾過

ろ過は、定義された基準でデータをフィルタリングし、データのサブセットを返します。 * filter()*関数は、データのフィルタリングに使用されます。

import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df.groupby('Team').filter(lambda x: len(x) >= 3)

その*出力*は次のとおりです-

    Points  Rank     Team   Year
0      876     1   Riders   2014
1      789     2   Riders   2015
4      741     3   Kings    2014
6      756     1   Kings    2016
7      788     1   Kings    2017
8      694     2   Riders   2016
11     690     2   Riders   2017

上記のフィルター条件では、IPLに3回以上参加したチームを返すよう求めています。

Python Pandas-マージ/参加

Pandasには、SQLなどのリレーショナルデータベースに非常によく似た、フル機能の高性能なメモリ内結合操作があります。

パンダは、DataFrameオブジェクト間のすべての標準データベース結合操作のエントリポイントとして、単一の関数 merge を提供します-

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)

ここでは、次のパラメータを使用しました-

  • -DataFrameオブジェクト。
  • right -別のDataFrameオブジェクト。
  • on -結合する列(名前)。 左右のDataFrameの両方にある必要があります オブジェクト
  • left_on -キーとして使用する左側のDataFrameの列。 DataFrameの長さと等しい長さの列名または配列のいずれかです。
  • right_on -キーとして使用する右側のDataFrameの列。 DataFrameの長さと等しい長さの列名または配列のいずれかです。
  • left_index -* Trueの場合、*左側のDataFrameのインデックス(行ラベル)を結合キーとして使用します。 MultiIndex(階層)を持つDataFrameの場合、レベルの数は、右側のDataFrameからの結合キーの数と一致する必要があります。
  • right_index -右側のDataFrameの left_index と同じ使用法。
  • 方法-「左」、「右」、「外側」、「内側」のいずれか。 デフォルトは内部です。 それぞれの方法について以下に説明します。
  • sort -辞書データ順に結合キーで結果のDataFrameをソートします。 デフォルトはTrueで、Falseに設定すると、多くの場合、パフォーマンスが大幅に向上します。

2つの異なるDataFrameを作成し、その上でマージ操作を実行してみましょう。

# import the pandas library
import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
   {'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right

その*出力*は次のとおりです-

    Name  id   subject_id
0   Alex   1         sub1
1    Amy   2         sub2
2  Allen   3         sub4
3  Alice   4         sub6
4  Ayoung  5         sub5

    Name  id   subject_id
0  Billy   1         sub2
1  Brian   2         sub4
2  Bran    3         sub3
3  Bryce   4         sub6
4  Betty   5         sub5

キー上の2つのデータフレームをマージする

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
    'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')

その*出力*は次のとおりです-

   Name_x   id  subject_id_x   Name_y   subject_id_y
0  Alex      1          sub1    Billy           sub2
1  Amy       2          sub2    Brian           sub4
2  Allen     3          sub4     Bran           sub3
3  Alice     4          sub6    Bryce           sub6
4  Ayoung    5          sub5    Betty           sub5

複数のキーで2つのデータフレームをマージする

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
    'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])

その*出力*は次のとおりです-

    Name_x   id   subject_id   Name_y
0    Alice    4         sub6    Bryce
1   Ayoung    5         sub5    Betty

「how」引数を使用したマージ

mergeの how 引数は、結果のテーブルに含めるキーを決定する方法を指定します。 キーの組み合わせが左テーブルにも右テーブルにも表示されない場合、結合テーブルの値はNAになります。

ここに*方法*オプションとそれらに相当するSQL名の要約があります-

Merge Method SQL Equivalent Description
left LEFT OUTER JOIN Use keys from left object
right RIGHT OUTER JOIN Use keys from right object
outer FULL OUTER JOIN Use union of keys
inner INNER JOIN Use intersection of keys

左結合

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')

その*出力*は次のとおりです-

    Name_x   id_x   subject_id   Name_y   id_y
0     Alex      1         sub1      NaN    NaN
1      Amy      2         sub2    Billy    1.0
2    Allen      3         sub4    Brian    2.0
3    Alice      4         sub6    Bryce    4.0
4   Ayoung      5         sub5    Betty    5.0

右結合

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')

その*出力*は次のとおりです-

    Name_x  id_x   subject_id   Name_y   id_y
0      Amy   2.0         sub2    Billy      1
1    Allen   3.0         sub4    Brian      2
2    Alice   4.0         sub6    Bryce      4
3   Ayoung   5.0         sub5    Betty      5
4      NaN   NaN         sub3     Bran      3

外部結合

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')

その*出力*は次のとおりです-

    Name_x  id_x   subject_id   Name_y   id_y
0     Alex   1.0         sub1      NaN    NaN
1      Amy   2.0         sub2    Billy    1.0
2    Allen   3.0         sub4    Brian    2.0
3    Alice   4.0         sub6    Bryce    4.0
4   Ayoung   5.0         sub5    Betty    5.0
5      NaN   NaN         sub3     Bran    3.0

内部結合

結合はインデックスで実行されます。 結合操作は、呼び出されたオブジェクトを優先します。 したがって、* a.join(b) b.join(a)*と等しくありません。

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')

その*出力*は次のとおりです-

    Name_x   id_x   subject_id   Name_y   id_y
0      Amy      2         sub2    Billy      1
1    Allen      3         sub4    Brian      2
2    Alice      4         sub6    Bryce      4
3   Ayoung      5         sub5    Betty      5

Pythonパンダ-連結

Pandasは、 Series、DataFrame 、および Panel オブジェクトを簡単に組み合わせるためのさまざまな機能を提供します。

 pd.concat(objs,axis=0,join='outer',join_axes=None,
ignore_index=False)
  • * objs-これは、Series、DataFrame、またはPanelオブジェクトのシーケンスまたはマッピングです。
  • axis -\ {0、1、…​}、デフォルトは0。 これは、連結する軸です。
  • join -\ {「inner」、「outer」}、デフォルトは「outer」。 他の軸のインデックスを処理する方法。 結合の外側と交差の内側。
  • ignore_index -ブール値、デフォルトはFalse。 Trueの場合、連結軸でインデックス値を使用しないでください。 結果の軸には、0、…​、n-1というラベルが付けられます。
  • join_axes -これは、インデックスオブジェクトのリストです。 内部/外部セットロジックを実行する代わりに、他の(n-1)軸に使用する特定のインデックス。

オブジェクトの連結

*concat* 関数は、軸に沿って連結操作を実行するという面倒な作業をすべて行います。 さまざまなオブジェクトを作成して連結してみましょう。
import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print pd.concat([one,two])

その*出力*は次のとおりです-

    Marks_scored     Name   subject_id
1             98     Alex         sub1
2             90      Amy         sub2
3             87    Allen         sub4
4             69    Alice         sub6
5             78   Ayoung         sub5
1             89    Billy         sub2
2             80    Brian         sub4
3             79     Bran         sub3
4             97    Bryce         sub6
5             88    Betty         sub5

特定のキーを、切り刻まれたDataFrameの各部分に関連付けたいとします。 これを行うには、 keys 引数を使用します-

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'])

その*出力*は次のとおりです-

x  1  98    Alex    sub1
   2  90    Amy     sub2
   3  87    Allen   sub4
   4  69    Alice   sub6
   5  78    Ayoung  sub5
y  1  89    Billy   sub2
   2  80    Brian   sub4
   3  79    Bran    sub3
   4  97    Bryce   sub6
   5  88    Betty   sub5

結果のインデックスは複製されます。各インデックスが繰り返されます。

結果のオブジェクトが独自のインデックス付けに従う必要がある場合は、 ignore_indexTrue に設定します。

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'],ignore_index=True)

その*出力*は次のとおりです-

    Marks_scored     Name    subject_id
0             98     Alex          sub1
1             90      Amy          sub2
2             87    Allen          sub4
3             69    Alice          sub6
4             78   Ayoung          sub5
5             89    Billy          sub2
6             80    Brian          sub4
7             79     Bran          sub3
8             97    Bryce          sub6
9             88    Betty          sub5

インデックスが完全に変更され、キーも上書きされることに注意してください。

*axis = 1* に沿って2つのオブジェクトを追加する必要がある場合、新しい列が追加されます。
import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print pd.concat([one,two],axis=1)

その*出力*は次のとおりです-

    Marks_scored    Name  subject_id   Marks_scored    Name   subject_id
1           98      Alex      sub1         89         Billy         sub2
2           90       Amy      sub2         80         Brian         sub4
3           87     Allen      sub4         79          Bran         sub3
4           69     Alice      sub6         97         Bryce         sub6
5           78    Ayoung      sub5         88         Betty         sub5

appendを使用した連結

concatへの便利なショートカットは、SeriesおよびDataFrameのappendインスタンスメソッドです。 これらのメソッドは、実際に連結に先行していました。 彼らは*軸= 0 *、すなわちインデックスに沿って連結します-

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print one.append(two)

その*出力*は次のとおりです-

    Marks_scored    Name  subject_id
1           98      Alex      sub1
2           90       Amy      sub2
3           87     Allen      sub4
4           69     Alice      sub6
5           78    Ayoung      sub5
1           89     Billy      sub2
2           80     Brian      sub4
3           79      Bran      sub3
4           97     Bryce      sub6
5           88     Betty      sub5
*append* 関数も複数のオブジェクトを取得できます-
import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print one.append([two,one,two])

その*出力*は次のとおりです-

    Marks_scored   Name    subject_id
1           98     Alex          sub1
2           90      Amy          sub2
3           87    Allen          sub4
4           69    Alice          sub6
5           78   Ayoung          sub5
1           89    Billy          sub2
2           80    Brian          sub4
3           79     Bran          sub3
4           97    Bryce          sub6
5           88    Betty          sub5
1           98     Alex          sub1
2           90      Amy          sub2
3           87    Allen          sub4
4           69    Alice          sub6
5           78   Ayoung          sub5
1           89    Billy          sub2
2           80    Brian          sub4
3           79     Bran          sub3
4           97    Bryce          sub6
5           88    Betty          sub5

時系列

パンダは、特に金融セクターにおいて、時系列データを使用した勤務時間の堅牢なツールを提供します。 時系列データを操作している間、次のことに頻繁に遭遇します-

  • 時間の生成シーケンス
  • 時系列を異なる周波数に変換します

Pandasは、上記のタスクを実行するための比較的コンパクトで自己完結型のツールセットを提供します。

現在の時刻を取得

  • datetime.now()*は現在の日付と時刻を提供します。
import pandas as pd

print pd.datetime.now()

その*出力*は次のとおりです-

2017-05-11 06:10:13.393147

タイムスタンプを作成する

タイムスタンプ付きデータは、値と時点を関連付ける最も基本的なタイプの時系列データです。 パンダオブジェクトの場合は、特定の時点を使用することを意味します。 例を見てみましょう-

import pandas as pd

print pd.Timestamp('2017-03-01')

その*出力*は次のとおりです-

2017-03-01 00:00:00

整数または浮動エポック時間に変換することも可能です。 これらのデフォルトの単位はナノ秒です(これらはタイムスタンプの格納方法であるため)。 ただし、多くの場合、エポックは指定可能な別のユニットに保存されます。 別の例を見てみましょう

import pandas as pd

print pd.Timestamp(1587687255,unit='s')

その*出力*は次のとおりです-

2020-04-24 00:14:15

時間の範囲を作成する

import pandas as pd

print pd.date_range("11:00", "13:30", freq="30min").time

その*出力*は次のとおりです-

[datetime.time(11, 0) datetime.time(11, 30) datetime.time(12, 0)
datetime.time(12, 30) datetime.time(13, 0) datetime.time(13, 30)]

時間の頻度を変更する

import pandas as pd

print pd.date_range("11:00", "13:30", freq="H").time

その*出力*は次のとおりです-

[datetime.time(11, 0) datetime.time(12, 0) datetime.time(13, 0)]

タイムスタンプへの変換

文字列、エポック、または混合など、日付のようなオブジェクトのシリーズまたはリストのようなオブジェクトを変換するには、 to_datetime 関数を使用できます。 渡されると、これは(同じインデックスを持つ)Seriesを返しますが、 list-likeDatetimeIndex に変換されます。 次の例を見てください-

import pandas as pd

print pd.to_datetime(pd.Series(['Jul 31, 2009','2010-01-10', None]))

その*出力*は次のとおりです-

0  2009-07-31
1  2010-01-10
2         NaT
dtype: datetime64[ns]
*NaT* は、 *Not a Time* (NaNと同等)を意味します

別の例を見てみましょう。

import pandas as pd

print pd.to_datetime(['2005/11/23', '2010.12.31', None])

その*出力*は次のとおりです-

DatetimeIndex(['2005-11-23', '2010-12-31', 'NaT'], dtype='datetime64[ns]', freq=None)

Pythonパンダ-日付機能

時系列を拡張する日付機能は、財務データ分析で重要な役割を果たします。 日付データで作業している間、私たちは頻繁に次のものに遭遇します-

  • 日付のシーケンスを生成する
  • 日付シリーズを異なる頻度に変換する

日付の範囲を作成する

期間と頻度を指定して* date.range()*関数を使用すると、日付系列を作成できます。 デフォルトでは、範囲の頻度は日数です。

import pandas as pd

print pd.date_range('1/1/2011', periods=5)

その*出力*は次のとおりです-

DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
   dtype='datetime64[ns]', freq='D')

日付の頻度を変更する

import pandas as pd

print pd.date_range('1/1/2011', periods=5,freq='M')

その*出力*は次のとおりです-

DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-30', '2011-05-31'],
   dtype='datetime64[ns]', freq='M')

bdate_range

bdate_range()は営業日範囲を表します。 date_range()とは異なり、土曜日と日曜日は除外されます。

import pandas as pd

print pd.date_range('1/1/2011', periods=5)

その*出力*は次のとおりです-

DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
   dtype='datetime64[ns]', freq='D')

3月3日以降、日付は4日と5日を除いて6月3日にジャンプします。 カレンダーを確認してください。

*date_range* や *bdate_range* などの便利な関数は、さまざまな周波数エイリアスを利用します。 date_rangeのデフォルトの頻度は暦日ですが、bdate_rangeのデフォルトの頻度は営業日です。
import pandas as pd
start = pd.datetime(2011, 1, 1)
end = pd.datetime(2011, 1, 5)

print pd.date_range(start, end)

その*出力*は次のとおりです-

DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
   dtype='datetime64[ns]', freq='D')

オフセットエイリアス

有用な一般的な時系列周波数に、多くの文字列エイリアスが与えられます。 これらのエイリアスをオフセットエイリアスと呼びます。

Alias Description Alias Description
B business day frequency BQS business quarter start frequency
D calendar day frequency A annual(Year) end frequency
W weekly frequency BA business year end frequency
M month end frequency BAS business year start frequency
SM semi-month end frequency BH business hour frequency
BM business month end frequency H hourly frequency
MS month start frequency T, min minutely frequency
SMS SMS semi month start frequency S secondly frequency
BMS business month start frequency L, ms milliseconds
Q quarter end frequency U, us microseconds
BQ business quarter end frequency N nanoseconds
QS quarter start frequency

Pythonパンダ-タイムデルタ

タイムデルタは時間の差であり、日、時間、分、秒などの異なる単位で表されます。 彼らは正と負の両方にすることができます。

以下に示すように、さまざまな引数を使用してTimedeltaオブジェクトを作成できます-

ひも

文字列リテラルを渡すことで、timedeltaオブジェクトを作成できます。

import pandas as pd

print pd.Timedelta('2 days 2 hours 15 minutes 30 seconds')

その*出力*は次のとおりです-

2 days 02:15:30

整数

整数値をユニットに渡すことにより、引数はTimedeltaオブジェクトを作成します。

import pandas as pd

print pd.Timedelta(6,unit='h')

その*出力*は次のとおりです-

0 days 06:00:00

データオフセット

-週、日、時間、分、秒、ミリ秒、マイクロ秒、ナノ秒などのデータオフセットも構築に使用できます。

import pandas as pd

print pd.Timedelta(days=2)

その*出力*は次のとおりです-

2 days 00:00:00

to_timedelta()

最上位の pd.to_timedelta を使用すると、スカラー、配列、リスト、またはシリーズを、認識されたタイムデルタ形式/値からタイムデルタ型に変換できます。 入力がシリーズの場合はシリーズを構築し、入力がスカラーのような場合はスカラーを構築し、そうでない場合は TimedeltaIndex を出力します。

import pandas as pd

print pd.Timedelta(days=2)

その*出力*は次のとおりです-

2 days 00:00:00

オペレーション

Series/DataFramesを操作し、 datetime64 [ns] SeriesまたはTimestampsの減算演算により timedelta64 [ns] Seriesを構築できます。

ここで、Timedeltaおよびdatetimeオブジェクトを使用してDataFrameを作成し、その上でいくつかの算術演算を実行しましょう-

import pandas as pd

s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))

print df

その*出力*は次のとおりです-

            A      B
0  2012-01-01 0 days
1  2012-01-02 1 days
2  2012-01-03 2 days

追加操作

import pandas as pd

s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']

print df

その*出力*は次のとおりです-

           A      B          C
0 2012-01-01 0 days 2012-01-01
1 2012-01-02 1 days 2012-01-03
2 2012-01-03 2 days 2012-01-05

減算演算

import pandas as pd

s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
df['D']=df['C']+df['B']

print df

その*出力*は次のとおりです-

           A      B          C          D
0 2012-01-01 0 days 2012-01-01 2012-01-01
1 2012-01-02 1 days 2012-01-03 2012-01-04
2 2012-01-03 2 days 2012-01-05 2012-01-07

Pythonパンダ-カテゴリーデータ

多くの場合、リアルタイムでは、データにはテキスト列が含まれますが、これは反復的です。 性別、国、コードなどの機能は常に繰り返されます。 これらは、カテゴリデータの例です。

カテゴリー変数は、限られた、通常は固定数の可能な値のみを取ります。 固定長に加えて、カテゴリデータには順序がありますが、数値演算を実行できません。 カテゴリーはパンダのデータ型です。

カテゴリーのデータ型は、次の場合に便利です-

  • 少数の異なる値のみで構成される文字列変数。 このような文字列変数をカテゴリ変数に変換すると、メモリを節約できます。
  • 変数の字句順序は、論理順序と同じではありません(「1」、「2」、「3」)。 カテゴリに変換し、カテゴリの順序を指定することにより、並べ替えと最小/最大は、語彙の順序ではなく論理的な順序を使用します。
  • この列をカテゴリ変数として扱う必要があるという他のpythonライブラリへのシグナルとして(例: 適切な統計手法またはプロットタイプを使用します)。

オブジェクト作成

カテゴリオブジェクトは複数の方法で作成できます。 さまざまな方法が以下に説明されています-

カテゴリー

pandasオブジェクト作成でdtypeを「category」として指定します。

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
print s

その*出力*は次のとおりです-

0  a
1  b
2  c
3  a
dtype: category
Categories (3, object): [a, b, c]

シリーズオブジェクトに渡される要素の数は4ですが、カテゴリは3つだけです。 出力カテゴリで同じことを確認します。

pd.Categorical

標準のパンダカテゴリコンストラクタを使用して、カテゴリオブジェクトを作成できます。

pandas.Categorical(values, categories, ordered)

例を見てみましょう-

import pandas as pd

cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print cat

その*出力*は次のとおりです-

[a, b, c, a, b, c]
Categories (3, object): [a, b, c]

別の例を見てみましょう-

import pandas as pd

cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print cat

その*出力*は次のとおりです-

[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]

ここで、2番目の引数はカテゴリを示します。 したがって、カテゴリに存在しない値は NaN として扱われます。

今、次の例を見てみましょう-

import pandas as pd

cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print cat

その*出力*は次のとおりです-

[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]

論理的に、順序は、 ab より大きく、 bc より大きいことを意味します。

説明

カテゴリデータで* .describe()コマンドを使用すると、 *type 文字列の Series または DataFrame に同様の出力が得られます。

import pandas as pd
import numpy as np

cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})

print df.describe()
print df["cat"].describe()

その*出力*は次のとおりです-

       cat s
count    3 3
unique   2 2
top      c c
freq     2 2
count     3
unique    2
top       c
freq      2
Name: cat, dtype: object

カテゴリのプロパティを取得する

*obj.cat.categories* コマンドを使用して、オブジェクトの *categoories* を取得します。
import pandas as pd
import numpy as np

s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print s.categories

その*出力*は次のとおりです-

Index([u'b', u'a', u'c'], dtype='object')
*obj.ordered* コマンドは、オブジェクトの順序を取得するために使用されます。
import pandas as pd
import numpy as np

cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print cat.ordered

その*出力*は次のとおりです-

False

順序を指定していないため、関数は false を返しました。

カテゴリの名前を変更する

カテゴリの名前を変更するには、* series.cat.categories * series.cat.categoriesプロパティに新しい値を割り当てます。

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print s.cat.categories

その*出力*は次のとおりです-

Index([u'Group a', u'Group b', u'Group c'], dtype='object')

初期カテゴリ [a、b、c] は、オブジェクトの s.cat.categories プロパティによって更新されます。

新しいカテゴリの追加

Categorical.add.categories()メソッドを使用して、新しいカテゴリを追加できます。

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print s.cat.categories

その*出力*は次のとおりです-

Index([u'a', u'b', u'c', 4], dtype='object')

カテゴリを削除する

  • Categorical.remove_categories()*メソッドを使用すると、不要なカテゴリを削除できます。
import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
print ("Original object:")
print s

print ("After removal:")
print s.cat.remove_categories("a")

その*出力*は次のとおりです-

Original object:
0  a
1  b
2  c
3  a
dtype: category
Categories (3, object): [a, b, c]

After removal:
0  NaN
1  b
2  c
3  NaN
dtype: category
Categories (2, object): [b, c]

カテゴリデータの比較

カテゴリデータを他のオブジェクトと比較することは、次の3つの場合に可能です-

  • 等しい(==および!=)をリストのようなオブジェクト(リスト、シリーズ、配列、…​)と比較する カテゴリデータと同じ長さ。
  • 別のカテゴリデータとのすべての比較(==、!=、>、> =、<、および⇐) categorical Series、ordered == Trueの場合、カテゴリは同じです。
  • カテゴリカルデータとスカラーのすべての比較。

次の例を見てください-

import pandas as pd

cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)

print cat>cat1

その*出力*は次のとおりです-

0  False
1  False
2  True
dtype: bool

Pythonパンダ-視覚化

基本的なプロット:プロット

SeriesおよびDataFrameのこの機能は、 matplotlib * libraries plot()*メソッドの単純なラッパーです。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',
   periods=10), columns=list('ABCD'))

df.plot()

その*出力*は次のとおりです-

基本的なプロット

インデックスが日付で構成されている場合、* gct()。autofmt_xdate()*を呼び出して、上の図に示すようにx軸をフォーマットします。

*x* および *y* キーワードを使用して、ある列と別の列をプロットできます。

プロット方法では、デフォルトのラインプロット以外のいくつかのプロットスタイルを使用できます。 これらのメソッドは、* plot()*のkindキーワード引数として提供できます。 これらには-

  • バープロットのバーまたはバー
  • ヒストグラムの履歴
  • 箱ひげ図の箱
  • 面積プロットの「面積」
  • 散布図の「散布」

バープロット

バープロットを作成して、バープロットとは何かを見てみましょう。 バープロットは次の方法で作成できます-

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar()

その*出力*は次のとおりです-

棒グラフ

積み上げ棒グラフを作成するには、 passstacked = True -

import pandas as pd
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar(stacked=True)

その*出力*は次のとおりです-

積み上げ棒グラフ

水平棒グラフを取得するには、 barh メソッドを使用します-

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')

df.plot.barh(stacked=True)

その*出力*は次のとおりです-

水平バープロット

ヒストグラム

ヒストグラムは、* plot.hist()*メソッドを使用してプロットできます。 ビンの数を指定できます。

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])

df.plot.hist(bins=20)

その*出力*は次のとおりです-

plot.hist()を使用したヒストグラム

列ごとに異なるヒストグラムをプロットするには、次のコードを使用します-

import pandas as pd
import numpy as np

df=pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])

df.diff.hist(bins=20)

その*出力*は次のとおりです-

列のヒストグラム

箱ひげ図

Boxplotは、* Series.box.plot()および DataFrame.box.plot()、または DataFrame.boxplot()*を呼び出して描画し、各列内の値の分布を視覚化できます。

たとえば、これは[0,1)上の一様なランダム変数の10回の観測の5回の試行を表す箱ひげ図です。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()

その*出力*は次のとおりです-

ボックスプロット

面積プロット

エリアプロットは、* Series.plot.area()または DataFrame.plot.area()*メソッドを使用して作成できます。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area()

その*出力*は次のとおりです-

エリアプロット

散布図

散布図は、* DataFrame.plot.scatter()*メソッドを使用して作成できます。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')

その*出力*は次のとおりです-

散布図

円グラフ

円グラフは、* DataFrame.plot.pie()*メソッドを使用して作成できます。

import pandas as pd
import numpy as np

df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
df.plot.pie(subplots=True)

その*出力*は次のとおりです-

円グラフ

Pythonパンダ-IOツール

*Pandas I/O API* は、一般的にPandasオブジェクトを返す* pd.read_csv()*のようにアクセスされる一連のトップレベルリーダー関数です。

テキストファイル(またはフラットファイル)を読み取るための2つの主な機能は、* read_csv()および read_table()です。 どちらも同じ解析コードを使用して、表形式のデータを *DataFrame オブジェクトにインテリジェントに変換します-

pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None
pandas.read_csv(filepath_or_buffer, sep='\t', delimiter=None, header='infer',
names=None, index_col=None, usecols=None
*csv* ファイルのデータは次のようになります-
S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900

このデータを temp.csv として保存し、操作を実行します。

S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900

このデータを temp.csv として保存し、操作を実行します。

read.csv

*read.csv* は、csvファイルからデータを読み取り、DataFrameオブジェクトを作成します。
import pandas as pd

df=pd.read_csv("temp.csv")
print df

その*出力*は次のとおりです-

   S.No     Name   Age       City   Salary
0     1      Tom    28    Toronto    20000
1     2      Lee    32   HongKong     3000
2     3   Steven    43   Bay Area     8300
3     4      Ram    38  Hyderabad     3900

カスタムインデックス

これは、csvファイルの列を指定して、* index_col。*を使用してインデックスをカスタマイズします。

import pandas as pd

df=pd.read_csv("temp.csv",index_col=['S.No'])
print df

その*出力*は次のとおりです-

S.No   Name   Age       City   Salary
1       Tom    28    Toronto    20000
2       Lee    32   HongKong     3000
3    Steven    43   Bay Area     8300
4       Ram    38  Hyderabad     3900

コンバーター

列の dtype を辞書として渡すことができます。

import pandas as pd

df = pd.read_csv("temp.csv", dtype={'Salary': np.float64})
print df.dtypes

その*出力*は次のとおりです-

S.No       int64
Name      object
Age        int64
City      object
Salary   float64
dtype: object

デフォルトでは、Salary列の dtypeint ですが、明示的に型をキャストしているため、結果は float として表示されます。

したがって、データはフロートのように見えます-

  S.No   Name   Age      City    Salary
0   1     Tom   28    Toronto   20000.0
1   2     Lee   32   HongKong    3000.0
2   3  Steven   43   Bay Area    8300.0
3   4     Ram   38  Hyderabad    3900.0

header_names

names引数を使用してヘッダーの名前を指定します。

import pandas as pd

df=pd.read_csv("temp.csv", names=['a', 'b', 'c','d','e'])
print df

その*出力*は次のとおりです-

       a        b    c           d        e
0   S.No     Name   Age       City   Salary
1      1      Tom   28     Toronto    20000
2      2      Lee   32    HongKong     3000
3      3   Steven   43    Bay Area     8300
4      4      Ram   38   Hyderabad     3900

ヘッダー名にカスタム名が追加されていますが、ファイル内のヘッダーは削除されていません。 次に、ヘッダー引数を使用してそれを削除します。

ヘッダーが最初以外の行にある場合は、行番号をヘッダーに渡します。 これにより、前の行がスキップされます。

import pandas as pd

df=pd.read_csv("temp.csv",names=['a','b','c','d','e'],header=0)
print df

その*出力*は次のとおりです-

      a        b    c           d        e
0  S.No     Name   Age       City   Salary
1     1      Tom   28     Toronto    20000
2     2      Lee   32    HongKong     3000
3     3   Steven   43    Bay Area     8300
4     4      Ram   38   Hyderabad     3900

スキップロウ

skiprowsは、指定された行数をスキップします。

import pandas as pd

df=pd.read_csv("temp.csv", skiprows=2)
print df

その*出力*は次のとおりです-

    2      Lee   32    HongKong   3000
0   3   Steven   43    Bay Area   8300
1   4      Ram   38   Hyderabad   3900

Pythonパンダ-スパースデータ

スパースオブジェクトは、特定の値(NaN/欠損値、任意の値を選択できます)に一致するデータが省略されると「圧縮」されます。 特別なSparseIndexオブジェクトは、データが「スパース化」された場所を追跡します。 これは、例でより意味があります。 標準のパンダのデータ構造はすべて、 to_sparse メソッドを適用します-

import pandas as pd
import numpy as np

ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts

その*出力*は次のとおりです-

0   -0.810497
1   -1.419954
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8    0.439240
9   -1.095910
dtype: float64
BlockIndex
Block locations: array([0, 8], dtype=int32)
Block lengths: array([2, 2], dtype=int32)

スパースオブジェクトは、メモリ効率の理由で存在します。

あなたが大きなNA DataFrameを持っていると仮定して、次のコードを実行してみましょう-

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10000, 4))
df.ix[:9998] = np.nan
sdf = df.to_sparse()

print sdf.density

その*出力*は次のとおりです-

0.0001

任意のスパースオブジェクトは、 to_dense を呼び出すことにより、標準の高密度形式に戻すことができます-

import pandas as pd
import numpy as np
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts.to_dense()

その*出力*は次のとおりです-

0   -0.810497
1   -1.419954
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8    0.439240
9   -1.095910
dtype: float64

スパースDtype

疎データは、その密表現と同じdtypeを持つ必要があります。 現在、 float64、int64 、および booldtypes がサポートされています。 元の dtypeに応じて、fill_value default が変更されます-

  • float64 -np.nan
  • int64 -0
  • bool -False

同じことを理解するために次のコードを実行してみましょう-

import pandas as pd
import numpy as np

s = pd.Series([1, np.nan, np.nan])
print s

s.to_sparse()
print s

その*出力*は次のとおりです-

0   1.0
1   NaN
2   NaN
dtype: float64

0   1.0
1   NaN
2   NaN
dtype: float64

Python Pandas-警告と落とし穴

警告は警告を意味し、落とし穴は目に見えない問題を意味します。

パンダでIf/Truthステートメントを使用する

Pandasは、何かを bool に変換しようとするとエラーを発生させるというnumpyの規則に従います。 これは、ブール演算を使用する if または when 、および or または not で発生します。 結果がどうあるべきかは明確ではありません。 長さがゼロではないため、Trueである必要がありますか? False値があるためFalse。 それは明確ではないので、代わりに、パンダは ValueError を発生させます-

import pandas as pd

if pd.Series([False, True, False]):
   print 'I am True'

その*出力*は次のとおりです-

ValueError: The truth value of a Series is ambiguous.
Use a.empty, a.bool() a.item(),a.any() or a.all().
*if* 状態では、それをどうするかは不明です。 エラーは、 *None* または* anyのいずれかを使用するかどうかを示唆しています。
import pandas as pd

if pd.Series([False, True, False]).any():
   print("I am any")

その*出力*は次のとおりです-

I am any

ブールコンテキストで単一要素のパンダオブジェクトを評価するには、メソッド* .bool()*を使用します−

import pandas as pd

print pd.Series([True]).bool()

その*出力*は次のとおりです-

True

ビットごとのブール

==や =のようなビット単位のブール演算子は、ブールシリーズを返します。これは、ほとんどの場合に必要なものです。

import pandas as pd

s = pd.Series(range(5))
print s==4

その*出力*は次のとおりです-

0 False
1 False
2 False
3 False
4 True
dtype: bool

isin操作

これは、シリーズの各要素が渡された値のシーケンスに正確に含まれているかどうかを示すブールシリーズを返します。

import pandas as pd

s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s

その*出力*は次のとおりです-

0 True
1 False
2 True
dtype: bool

再索引付けとix Gotcha

多くのユーザーは、パンダオブジェクトからデータを選択する簡潔な手段として* ixインデックス機能*を使用していることに気付くでしょう-

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.ix[[b', 'c', 'e']]

その*出力*は次のとおりです-

          one        two      three       four
a   -1.582025   1.335773   0.961417  -1.272084
b    1.461512   0.111372  -0.072225   0.553058
c   -1.240671   0.762185   1.511936  -0.630920
d   -2.380648  -0.029981   0.196489   0.531714
e    1.846746   0.148149   0.275398  -0.244559
f   -1.842662  -0.933195   2.303949   0.677641

          one        two      three       four
b    1.461512   0.111372  -0.072225   0.553058
c   -1.240671   0.762185   1.511936  -0.630920
e    1.846746   0.148149   0.275398  -0.244559

これは、もちろん、この場合 reindex メソッドを使用することと完全に同等です-

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.reindex(['b', 'c', 'e'])

その*出力*は次のとおりです-

          one        two      three       four
a    1.639081   1.369838   0.261287  -1.662003
b   -0.173359   0.242447  -0.494384   0.346882
c   -0.106411   0.623568   0.282401  -0.916361
d   -1.078791  -0.612607  -0.897289  -1.146893
e    0.465215   1.552873  -1.841959   0.329404
f    0.966022  -0.190077   1.324247   0.678064

          one        two      three       four
b   -0.173359   0.242447  -0.494384   0.346882
c   -0.106411   0.623568   0.282401  -0.916361
e    0.465215   1.552873  -1.841959   0.329404
*ix* と *reindex* はこれに基づいて100%同等であると結論付ける人もいます。 これは、整数のインデックス付けの場合を除いて当てはまります。 たとえば、上記の操作は、代わりに-
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.ix[[print df.reindex([1, 2, 4])

その*出力*は次のとおりです-

          one        two      three       four
a   -1.015695  -0.553847   1.106235  -0.784460
b   -0.527398  -0.518198  -0.710546  -0.512036
c   -0.842803  -1.050374   0.787146   0.205147
d   -1.238016  -0.749554  -0.547470  -0.029045
e   -0.056788   1.063999  -0.767220   0.212476
f    1.139714   0.036159   0.201912   0.710119

          one        two      three       four
b   -0.527398  -0.518198  -0.710546  -0.512036
c   -0.842803  -1.050374   0.787146   0.205147
e   -0.056788   1.063999  -0.767220   0.212476

    one  two  three  four
1   NaN  NaN    NaN   NaN
2   NaN  NaN    NaN   NaN
4   NaN  NaN    NaN   NaN
  • reindexは厳密なラベルインデックスのみであることに注意することが重要です。 これにより、インデックスに整数と文字列の両方が含まれるような病理学的なケースで、驚くべき結果が生じる可能性があります。

Python Pandas-SQLとの比較

多くの潜在的なPandasユーザーはSQLにある程度精通しているため、このページはパンダを使用してさまざまなSQL操作を実行する方法の例を提供することを目的としています。

import pandas as pd

url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
print tips.head()

その*出力*は次のとおりです-

    total_bill   tip      sex  smoker  day     time  size
0        16.99  1.01   Female      No  Sun  Dinner      2
1        10.34  1.66     Male      No  Sun  Dinner      3
2        21.01  3.50     Male      No  Sun  Dinner      3
3        23.68  3.31     Male      No  Sun  Dinner      2
4        24.59  3.61   Female      No  Sun  Dinner      4

SELECT

SQLでは、選択は、選択した列のコンマ区切りリストを使用して行われます(またはすべての列を選択するには*)-

SELECT total_bill, tip, smoker, time
FROM tips
LIMIT 5;

Pandasでは、列名のリストをDataFrameに渡すことで列の選択が行われます-

tips[[total_bill', 'tip', 'smoker', 'time']].head(5)

完全なプログラムを確認しましょう-

import pandas as pd

url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
print tips[[total_bill', 'tip', 'smoker', 'time']].head(5)

その*出力*は次のとおりです-

   total_bill   tip  smoker     time
0       16.99  1.01      No   Dinner
1       10.34  1.66      No   Dinner
2       21.01  3.50      No   Dinner
3       23.68  3.31      No   Dinner
4       24.59  3.61      No   Dinner

列名のリストなしでDataFrameを呼び出すと、すべての列が表示されます(SQLの*と同様)。

どこに

SQLでのフィルタリングはWHERE句を介して行われます。

  SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;

DataFramesは複数の方法でフィルタリングできます。最も直感的なのは、ブールインデックスを使用することです。

  tips[tips['time'] == 'Dinner'].head(5)

完全なプログラムを確認しましょう-

import pandas as pd

url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
print tips[tips['time'] == 'Dinner'].head(5)

その*出力*は次のとおりです-

   total_bill   tip      sex  smoker  day    time  size
0       16.99  1.01   Female     No   Sun  Dinner    2
1       10.34  1.66     Male     No   Sun  Dinner    3
2       21.01  3.50     Male     No   Sun  Dinner    3
3       23.68  3.31     Male     No   Sun  Dinner    2
4       24.59  3.61   Female     No   Sun  Dinner    4

上記のステートメントは、一連のTrue/FalseオブジェクトをDataFrameに渡し、すべての行をTrueで返します。

GroupBy

この操作は、データセット全体で各グループのレコード数を取得します。 たとえば、性別によって残されたヒントの数を取得するクエリ-

SELECT sex, count(*)
FROM tips
GROUP BY sex;

パンダに相当するものは-

tips.groupby('sex').size()

完全なプログラムを確認しましょう-

import pandas as pd

url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
print tips.groupby('sex').size()

その*出力*は次のとおりです-

sex
Female   87
Male    157
dtype: int64

上位N行

SQLは LIMIT を使用して*上位n行*を返します-

SELECT * FROM tips
LIMIT 5 ;

パンダに相当するものは-

tips.head(5)

完全な例を確認しましょう-

import pandas as pd

url = 'https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
tips = tips[[smoker', 'day', 'time']].head(5)
print tips

その*出力*は次のとおりです-

   smoker   day     time
0      No   Sun   Dinner
1      No   Sun   Dinner
2      No   Sun   Dinner
3      No   Sun   Dinner
4      No   Sun   Dinner

これらは、Pandas Libraryの前の章で学んだ、比較した数少ない基本的な操作です。