てつまぐとは?

Pandas DataFrameを解説(結合、抽出、追加の基本から応用まで)

pythonではデータ解析をよく行います。

そんな中よく使うデータといえば、表データではないでしょうか?

表データは次のようなデータです。

エクセルのデータだったり、データベースのデータのことです。

列名 列名 列名

この表データを簡単に扱うことができるのが、pandasというライブラリです。

今回はpandasについて習得していきます。

以前の記事で、CSVファイルの読み込みについて紹介しました。

pandasを使ったCSVファイルの読み込み方法と書み込み方法

今回は、読み込んだ後に使う、pandasの機能を紹介します。

機能は数多くあるのですが、よく使うものを厳選して紹介します。

本記事のサンプルコード

>>サンプルコード(jupyter notebook)

pandasについて

pandasはデータ解析やデータ操作、計算などを簡単にするライブラリです。

主に、表データを取り扱います。

>> pandas公式

インストール

インストールは下記のように、pipで行います。

読み込み

ライブラリの読み込みは、次のようにします。

DataFrameについて

pandasで取り扱う、データはDataFrameという型で取り扱います。

DataFrameは次のような「values」「columns」「index」で構成されます。

pandasの基本

まず、基本的な使い方を抑えていきましょう。

DataFrameを作って、データを取り出し、計算するところまでを紹介します。

データを作る

簡単なDataFrameを作っていきます。

valuesのみ

listで2次元データを作って、valuesのみを与えたDataFrameを作ってみます。

DataFrame作り方

df = pd.DataFrame(listデータ)

listでvaluesのみのデータを作ったはずが、columnsとindexがあります。

ない場合は、勝手に0, 1, 2,…と割り当てられます。

columns,indexをつける

valuesと一緒に、colums、indexもつけてみましょう。

columns,indexをつける

df = pd.DataFrame(listデータ, columns=列名, index=行名)
*行名、列名はlist、tupleなどの配列で与えます。

行列名がつきました。

大抵は、列名だけをつけることが多いです。その場合、indexを省略すればOKです。

エクセルにしても、データベースにしても列名のみが多いためです。

indexは0,1,2,..の連番で十分というのもあります。

CSVの読み込み、データの確認

CSVの読み込みやデータの確認は、下記の以前の記事を参照ください。

pandasを使ったCSVファイルの読み込み方法と書み込み方法

下記、添付の加工帳明細のデータを読み込みます。

>> 加工帳明細

次のコードで読み込みます。

読み込んだdfは、この記事でこれからで使っていきます。

データを取り出す

読み込んだデータを取り出す方法について紹介します。

まず、 DataFrameを構成するものを取り出します。

index, columns, valuesを取り出す

上から、index,columns,valuesが表示されています。

列名を確認するときに使うことが多いです。

列単位で取り出す

この列とこの列が欲しいと言ったように列単位で取り出す場合は、列名をlistで渡します。

列単位で取得

df[列名の配列]

このでは、先ほど確認した列名の結果を見ると、次の列名があります。

なので、ここから、取得した列名を指定するだけです。

例えば、「径」「材質」であれば、次のようになります。

不要な列を削って、必要な列のみのデータにするときに使います。

行単位で取り出す

行単位で取り出す場合は、取得する行数を指定します。

行単位で取得

df[開始行数:終了行数]
*行数は0から始まり、終了行数の1つ前まで取得します。

例えば、2行目目から4行目目まで取得する場合は次のようにします。

座標指定で取り出すiloc,loc

図のように、部分的にデータを取り出したい場合は、iloc若しくはlocを使います。

ilocでは数値で座標を指定します。

iloc

df.iloc[開始行数:終了行数,開始列数:終了列数]
*行数は0から始まり、終了行数の1つ前まで取得します。

2行目-4行目、4列目-6列目まで取得してみます。

開始行数:終了行数,開始列数:終了列数はそれぞれ、省略することが可能です。

省略時は、開始行列数の場合は0から、終了行列数は最終までが指定されます。

例えば、下記表のように色々な使い方があります。

df.iloc[:,3:6] 全行、4列目-6列目
df.iloc[1:4, :] 2行目-4行目、全列
df.iloc[2:, 3:6] 3行目-最終行、4列目-6列目
df.iloc[1:4, :6] 2行目-4行目、開始列-6列目

locでは、行名、列名を指定します。

loc

df.loc[行名配列, 列名配列]

1,3行目の「径」「材質」の列を取得してみます。

繰り返し処理で取り出す

行や列を順番に繰り返して、データを取り出したいということがあります。

主に、行を順番に繰り返すことが多いです。

まず、行を繰り返して取得する場合を紹介します。

行を繰り返す場合、iterrows()を使います。

行の繰り返し

for ind, row in df.iterrows():

indには行番号、rowには1行分のデータが入っていて、列名を指定するとデータが取得できます。

実際のコードでみてみましょう。

次に、列を繰り返して取得する場合を紹介します。

列を繰り返す場合、iteritems()を使います。

列の繰り返し

for col_name, col in df.iteritems():

col_nameには列名、colには1列分のデータが入っていて、行数を指定するとデータが取得できます。

実際のコードでみていきましょう。

今回はcol[[0, 1]]とせず、col[0]、col[1]と1つずつ指定することもできます。

以上が、データの取り出し方です。

これらの方法で読み込んだデータを取り出せるようになっておきましょう。

計算

次はデータの計算を紹介します。

わかりやすくするため、列を[‘定尺本数’, ‘定尺長さ’]に絞ってみていきます。

統計量を確認

各列の統計量はdescribeを使うことで確認することができます。

それぞれの統計量を取得したい場合は、1列目に表示されているメソッドを使うことで取得できます。

列同士の計算

この列とこの列を計算して、新しい列を追加したい場合があります。

その時は、下記のように列同士を四則演算子で計算すると全部の行を計算してくれます。

列同士の計算

df.[新しい列名] = df.[列名1] * df.[列名2]

単純に値を入れても、列の数分だけ値が入ります。

ここまでを抑えておけば、基本的なデータの読み込み、取り出し、計算ができます。

実際には、データに欠損が多かったり、より複雑な条件で取り出したいなどが出てきます。

そんな場合は、次の応用編の知識が必要となります。

pandasの応用

ここからは、条件での検索や、データの欠損値の処理などを紹介します。

色々あるので、ざっとみて、使いたい時に見直していただくと良いです。

一意の値を取得

データには長さや重さのような数値のものと、名称や記号のデータがあります。

名称や記号のデータをカテゴリカルデータと言います。

今使っている加工帳明細では、例えば「径」の列です。

今はデータが少ないので、「D19」「D13」があることがわかります。

しかし、データが多い場合、全部のデータを見て確認するのは大変です。

その時は、uniqueを使い、重複のない(一意)のデータを取り出します。

検索

データを取り出すのは基本編で紹介しました。

しかし、検索して効率的にデータを取り出したい場合があります。

検索でデータを取り出すにはいくつか方法がありますので、紹介していきます。

列ごとに条件をつける

各列ごとに比較演算子で条件を指定することで、一致する条件のデータだけ取得できます。

列同士の計算

df2 = df[df[列名1] 比較演算子 値]

複数条件 and
df2 = df[(df[列名1] 比較演算子 値) & (df[列名2] 比較演算子 値)]

複数条件 or
df2 = df[(df[列名1] 比較演算子 値) | (df[列名2] 比較演算子 値)]

「径」列がD13のものを取得してみます。

条件指定したデータはdf2に新しく入れています。

3列だけ表示していますが、D13のみのデータが取得できています。

これは、分解してみるとわかりやすいのですが、条件式からは一致した行がTrue/Falseが取得できます。

このTrueの箇所の行を取得しています。

locを使う

locでも同様に条件からデータを取得できます。

locをつけて、検索します。今回は、「定数本数」の条件も増やします。

queryを使う

queryメソッドを使った検索方法を紹介します。

queryは次のような使い方をします。

queryの検索

df2 = df.quey[条件式]

条件式は次のようにいくつかあります。

条件式 意味
列名 比較演算子 値 径 == ‘D13’
定尺長さ > 5
径がD13のもの
定尺長さが5より大きい
not 列名 比較演算子 値
not 径 == ‘D13’ 径がD13の以外のもの
値 比較演算子 列名 比較演算子 値 5 < 定尺長さ <20 定尺長さが5より大きく、20未満
列名 in [‘値’, ‘値’] 径 in [‘D13’, ‘D19’] 径がD13、D19のもの
列名 not in [‘値’, ‘値’] 径 not in [‘D13’, ‘D19’] 径がD13、D19以外のもの

2つ実際に見ていきます。

queryには文字列で条件を渡すので、シングルコーテーションで囲ったら、中の検索文字はダブルコーテーションで囲いましょう。

逆でも良いです。

他にも色々試してみてください。

関数の適用

ある列を関数を使った処理をすることが可能です。

例えば、「径」列を次の表のように「単位質量」に変換したい場合があります。

>> 参照リンク

その時は、mapを使います。

「径」を表から数値にした「単位質量」列を作成します。

まず、関数を用意します。

引数のxには、列の値が入ってきます。

あとは、map(関数)とします。

表の通りに変換できてますね。

単位質量がわかると、次のように鉄筋総重量が計算できますね。

結合

データは複数のリソースから取得することがあります。

例えば、ファイルが分かれている場合ですね。

結合は横方向と縦方向の結合があります。

結合では、結合となるキー列を使って、同じ値のものを結合します。

そのため、横結合はいくつか種類があります。

結合種類 イメージ メソッド
縦結合 append
横結合 内部 merge
左外部 merge(how=”left”)
*howは引数
右外部 merge(how=”right”)
*howは引数
外部 merge(how=”outer”)
*howは引数

Nanとなっている部分は、データがないということを意味します。

結合する条件が一致しない場合は、データがないのでNanとなります。

縦結合

縦結合にはappendを使います。

径をD13とD19で分けたものを、結合してみます。

df1とdf2に分けて、二つのデータを読み込んできたと仮定します。

この2つを結合してdf3に入れます。

結合できていますね。

内部結合

横結合にはmergeを使います。

同じく、データを2つに分けます。

二つのデータを読み込んできたと仮定します。

順番に見ていきます。

内部結合

左外部結合

右外部結合

完全外部結合

並び替え

データを並べ替える場合には、sort_valuesを使います。

並べ替え

df2 = df.sort_values(列名, ascending=True /False)
*ascendingは省略時はTrueでTrueは昇順、Falseは降順

「関数の適用」のパートで計算した鉄筋総重量[t]を並べ替えてみます。

欠損値

データはきれいに埋まってなく、データがない状態(欠損値)がある場合もあります。

欠損値の確認

欠損値であるかどうかは、isnullを使うことで確認できます。

このようにTrue/Falseで判定されます。Trueが欠損値です。

True=1、False=0と扱われるので、これをsumを使って合計すると、各列の欠損値の数がわかります。

この欠損値をどうするかは、削除するか、違う値で埋めるかです。

欠損値を削除

削除にはdropnaを使います。

欠損値削除

df2 = df.dropna(how=”all”/”any”, axis=0/1)
*howは省略時はanyで、anyは1つでも欠損値があれば削除、allは全てが欠損値なら削除
*axisは省略時は0で、0は行方向に削除、1は列方向に削除

dropnaを引数なしで、使ってみます。

how=”any”, axis=0の状態です。欠損値がある、行を削除します。。

全てのデータが消えます。

次に axis=1にして、欠損値がある列を削除します。

データのない列を消すことができます。

欠損値を埋める

欠損値を埋める場合は、fillnaを使います。

0で埋めてみます。

0で埋まりましが、これ自体は何も意味をなしていません。

実際には、貴重なデータをなるべく減らさず機械学習で使いたいというときに、他のデータから判断して、平均値などで埋めます。

集約

同じ値を持つデータをまとめて、平均、最大値などを計算することができます。

集約にはgroupbyを使います。

集約

合計
df2 = df.groupby(‘列名’).sum()

平均
df2 = df.groupby(‘列名’).mean()

標準偏差
df2 = df.groupby(‘列名’).std()

中央値
df2 = df.groupby(‘列名’).median()

[‘径’, ‘定尺本数’, ‘定尺長さ’]を使って、「径」で集約してみます。

この計算自体はあまり意味がありませんが、性別によるデータの平均値など計算するときに便利です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です