最終更新日:2021/8/11

【説明すること】

1.行と列を指定してデータを取り出す

行、列を指定して、その要素を取り出す場合です。
対象のdfに対し、df.at[], df.loc[]df.iat[], df.iloc[]を使って書きます。
以下のサイトがとても詳しいので、詳細はそちらを参照してください。当ページでは要点のみを述べます。

https://note.nkmk.me/python-pandas-at-iat-loc-iloc/

.at[], .loc[]や iat[], iloc[]の違いを述べておきます。
at系は「要素1つ」しか取り出せません。ピンポイントの場合です。
loc系は複数の要素を「範囲」で取り出せます。
また、iがつくiat, ilocは番号で指定し、iがつかないものは名前で指定します。

【名前か番号か】
.at[X, Y], .loc[X, Y]    = 名前で指定する(index名とカラム名)
.iat[x, y], .iloc[x, y] = 番号で指定する

【1個か複数範囲か】
.at[X, Y], .iat[x, y]    = 要素1つのみ
.loc[X, Y], .iloc[x, y] = 複数の要素を範囲で拾う

※大文字X, Yは文字列を表します。例えば、X=’Japan’です。小文字x, y は整数です。

.at[], .loc[]で名前を指定する場合、index名とカラム名(列名)で指定します。
.loc[].iloc[]で連続した行や列(0~2行など)を指定する場合にはスライス([:])で、とびとびの行や列(0,2行目など)を指定する場合はリスト([,])で範囲を与えます。

名前で指定番号で指定
要素1つのみ.at[X, Y].iat[x, y]
複数の要素(範囲).loc[X, Y].iloc[x, y]

ここでは以下のcsvファイルを読み込んで、コードの例を挙げます。

a004_003a.csv

2. 条件を指定してデータを抽出する

df(データフレーム, DataFrame)の列に条件を指定し、条件に合致する行を抽出する方法を説明します。
Excelで言うと、「フィルター」です。

2.1 列に1つの条件を指定してフィルター

df[df['clm'] 条件]

と書きます。これはExcelのフィルターに相当します。
ポイントはdf[df['clm'] == 1]のように、df名を2回書く事です。1回だけ書くと、条件の真偽(True/False)のみを返します。

2.2 列に複数の条件を指定してフィルター

複数の条件を指定する場合は、

df[df['clm1'] 条件1 & df['clm2'] 条件2]

と条件を並べます。
「かつ」ならば「&」で、「または」ならば「|」(Shirt+\)で条件を書きます。
注意:「and」や「or」で書くとエラーになります。

3. 文字列の条件でデータを抽出する

文字列で、特定の文字を含むものを抽出する場合です。
これも以下のサイトが詳しいので、詳細はそちらを参照してください。

https://note.nkmk.me/python-pandas-str-contains-match/

3.1 完全一致でフィルター(複数の文字列)

例えば、XまたはYと「一致する」ものを抽出する場合、

df[df['clm'].isin(['X', 'Y'])]

と書きます。
数値と同様に==|で条件を指定してもいいのですが、条件が多い場合、この記述が便利です。
例えば、listでli1=['Japan', 'US', 'China']と条件を与えたい場合もあるでしょう。この場合、listで条件を与えて、
df[df['clm'].isin(li1)]
とすることも可能です。
現場では、条件をlistで持つ事が多いので、これは割と使う場面が多いです。
勿論、==|で書いた場合と同じ結果です。

3.2 部分一致でフィルター

例えば、カラム名’clm’にxを含むものの場合、

df[df['clm'].str.contains('x')]

と書きます。
文字列のカラム(列)を指定して、その列に特定の文字を「含むもの」を抽出する場合です。
これもExcelのフィルターと同じで、「指定の値を含む」に相当します。

ここでは、以下のcsvファイルを読み込みます。

a003_001.csv

4. indexに条件をつけて抽出する

ここまではカラム(列)に条件をつけてきましたが、ここではindexに条件をつけて抽出する方法を示します。

4.1 index番号を指定して抽出

df[df.index == n]またはdf[df.index.isin([0,1,2])]

と書きます。

index番号が1個の場合 df[ df.index == n ] と書いて指定します。

また、 df[ df.index >= m ] と書けば、m以上のもの全てを抽出します。

複数指定する場合は.isin()の引数にlistで番号を指定すれば、抽出可能です。
df[df.index.isin([0,1,2])]

ここでは以下のcsvファイルを読み込みます。

a004_001a.csv

4.2 indexにindex名(文字例)を指定して抽出

df[df.index == 'X']またはdf.index.isin(['a1','b2'])

と書きます。

1個の場合、df.index==を使ってindex名を指定します。
複数個の場合、df.index.isin(['a1','b2'])とlistでindex名を与えれば、抽出可能です。

5. indexがdatetime型の場合

indexがdatetime型の場合、とても便利な使い方があります。
時系列データ(例えば日次の株価)を扱う場合には、日付をdatetime型にしておくと、期間を指定した演算(平均など)が簡単に行え、便利です。

以下のcsvファイルを読み込みます。
indexをdatetime型にしたいので、pd.read_csv('a004_003b.csv', index_col=0, parse_dates=True)と、オプションを幾つか指定してください。

a004_003b.csv

【ポイント】
csvをそのまま読み込んでもobject型になるので、必ずdatetime型への変換が必要です。
これは、pd.read_csv()index_col=0(indexとする列番号), parse_dates=Trueをオプションに指定します。

df['2021']で2021年のデータの抽出です。
df['2021-06']で2021年6月のデータの抽出です。
df['2021-07-12']で2021年7月12日のデータの抽出です。
※注意: 年月の指定は「”」または「””」で囲みます。

あるいは、df.indexを使って、
df[df.index.year == 2021] で201年のデータの抽出です。
df[df.index.month == 6] で6月のデータの抽出です(年とは無関係)。
df[df.index.day == 12] で12日のデータの抽出です(年、月とは無関係)。

df[(df.index.year == 2020) & (df.index.month == 7) ] で2020年7月のデータの抽出です。
df[(df.index >= '2021-06-13') & (df.index <= '2021-07-12')] で2021年6月13日から2021年7月12日までのデータの抽出です。