最終更新日:2021/8/11
【説明すること】
- 1. 行と列を指定してデータを取り出す:
df.at[]
,df.iat[]
,df.loc[]
,df.iloc[]
- 2. 条件を指定してデータを抽出する
- 2.1 列に1つの条件を指定してフィルター:
df[df['clm'] 条件]
- 2.2 列に複数の条件を指定してフィルター:
df[df['clm1'] 条件1 & df['clm2'] 条件2]
- 2.1 列に1つの条件を指定してフィルター:
- 3. 文字列の条件でデータを抽出する
- 3.1 完全一致でフィルター:
df[df['clm'].isin(['X', 'Y'])]
- 3.2 部分一致でフィルター:
df[df['clm'].str.contains('x')]
- 3.1 完全一致でフィルター:
- 4. indexに条件をつけて抽出する
- 4.1 index番号を指定して抽出 :
df[df.index == n]
またはdf[df.index.isin([0,1,2])]
- 4.2 indexにindex名(文字例)を指定して抽出 :
df[df.index == 'X']
またはdf.index.isin(['a1','b2'])
- 4.1 index番号を指定して抽出 :
- 5. indexがdatetime型の場合
df['2021']
,df['2021-06']
df[df.index.year == 2021]
,df[df.index.month == 6]
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ファイルを読み込んで、コードの例を挙げます。
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ファイルを読み込みます。
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ファイルを読み込みます。
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)
と、オプションを幾つか指定してください。
【ポイント】
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日までのデータの抽出です。