本日はPandasというライブラリを使って表形式のデータの処理の方法を紹介します。表形式と言えばExcelでの操作に慣れている人が多いかと思いますが、同じこともしくはそれ以上のことがPythonのPandasライブラリを使ってできます。こんな人が対象Python初心者でPandasを使い始めている人Pandasを使ったDataFrameのを使いこなしたい人Pandasには配列の次元によって以下のようにオブジェクトが区別されています。下の表のようにExcelの表全体をDataFrameと言い、各列(1次元配列)をSeriesと考えていればオッケーですね(^^)また、列をcolumn(カラム)と言い、行をrow(ロー)もしくはレコードと言ったりします。1番上の列のタイトルに相当する行はheader(ヘッダー)と言います。pandasを使ったデータの処理に属性を使うのですが、これらの用語がそのまま属性の名前になっており、よく使うため用語をよく覚えておきましょう。データの前処理はとても重要な工程であり、その工程においてPythonを使う限り必ず使うのがPandasライブラリです。日本語の書籍も充実しているため1冊手元に置いておく辞書代わりとして使えます。条件にデータを絞る条件を満たすものに値を入れる条件を満たさないものに値を入れる順番の並べ替え2つのデータを結合するDataFrameの色々な結合の仕方NaNを別の要素に置き換えるDataFrameの要素のデータの型を変更するグルーピングして統計量を計算するグルーピングの最大値を計算グルーピングの平均値を計算グルーピングの標準偏差を計算DataFrameの統計量を見たい場合:describeまとめSeriesオブジェクト(1次元配列)DataFrameオブジェクト(2次元配列)Seriesオブジェクト1次元のデータを取り扱うSeriesについて学びます。Seriesについての使い方は公式ドキュメントを参考にしながら学ぶことをお勧めします。ものすごく多くの属性が用意されているので、とても覚えきれるものではありませんが、本記事ではよく使うものを紹介します。カマキリ属性については後ほど解説します。必要なライブラリをインポートしましょう。nppandasというライブラリを「pd」と略してインポートし、numpyライブラリを「np」と略してインポートしておきます。numpyの配列から1次元配列のSeriesオブジェクトを生成してみましょう。indexを指定するまずはindexを指定してSeries型を作ってみましょう。[‘a’,’b’,’c’,’d’,’e’,’f’]でSeriesの1次元配列のindexをリスト型で生成しています。)として引数にndarray配列とindexに先ほどのリスト型を入れています。float64このように1次元配列のデータを作ることができました。辞書型でSeriesを作る次は辞書型をSeriesの引数に渡して1次元配列を作成していましょう。int64このようにして辞書型を介してデータを1次元配列を作ることができます。属性(attributes)pandasのSeriesにはデータを取り扱うための属性(attributes)が多く用意されています。(インスタンス変数名).(属性)とすればインスタンスとなっているndarrayの情報を取得することができます。ここではよく使う属性について紹介します。name属性name属性を使うことででデータに名前を付けることができます。データに名前を付けるname属性を使うことで1次元配列の名前を取得することができます。pd.Series(dct,name='data')df.nameSeries(dct,name=’data’)としてデータの名前を「data」としました。【結果】Pythondata1dataデータの名前の更新また、データの名前を更新するには以下のように記述します。'data_new'df.name【結果】Pythondata_new1data_newindex属性index属性を使うことでSeriesのindexを操作することができます。indexを更新する1次元配列のデータの各行にindexとしてデフォルトでは数字が0から割り振られています。リストをSeriesに入れてみます。int64このように1列目はindexが0からはじまる整数で割り当てられています。さきほど見たように辞書型をSeriesに入れるとindexが辞書型のキーとして割り当てられます。以下のようにindex属性を確認してみましょう。dtype='object')indexの値を取り出したい場合は、さらに「.(ドット)」でつなげることで値を取得できます。'numpy.ndarray'>indexを更新する属性にリスト型を代入することでindexを更新することができます。dtype='object')values属性index属性はvalues(値)に関連付けられたキーを所得するSeriesの属性でしたが、values属性を使うことで1次元配列のデータを取得することができます。4])shape属性shape属性を使うことでデータの大きさを確認することができます。Pythondf.shape1df.shape【結果】Python(4,)1(4,)以上のようにpandasのSeriesを使うことで1次元配列のデータを取り扱うことができました。DataFrameオブジェクト次に2次元配列を持ったDataFrameを取り扱います。DataFrameは以下のようにExcelの表のように縦と横にデータがぎっしり詰まっている2次元配列のデータです。必要なライブラリをインポートしましょう。nppanasのDataFrameはnumpyとの相性が良く、以下のように0~11の数字を2次元配列にしたものをDataFrameに入れることで表が作成できます。numpyを使って2次元配列を作ります。11]])これをDataFrameに入れます。簡単にデータフレームが作成できましたね。indexとheaderを指定indexやheaderを指定することもできます。columns=columns)df辞書型にしてDaraFrameに入れる先ほどのようにindexを別で指定することもできますが、下記のように辞書型をDataFrameに入れることで、辞書型のキーがDataFrameのheaderになります。pd.DataFrame(list_dct)df【結果】こちらを応用して大きなDataFrameをfor文で作ってみましょう。行数が多いDataFrameに対しては、行数が多すぎると見にくいため、最初の数行だけを表示する属性を使います。Pythondf.head()1df.head()【結果】head属性を使うことで最初の5行だけを表示することができました。最初の10行だけを見たい場合は引数に「10」と指定することで、10行分表示することができます。最後の数行(10行)だけを取り出す最後の数行だけを取り出したい場合には「tail」を使います。引数に抜き出したい行数を指定するができます。Pythondf.tail(10)1df.tail(10)【結果】データの情報を確認Pandasのinfoメソッドを使うことで、行数・列数やデータの型、メモリ使用量を確認することができます。それだけではなく、大量のデータの中の欠損値ではない要素の数を知ることができます。データの型、メモリ使用量などの情報を確認df.info()【結果】headerとindexを抜き出すDataFrameのheaderとindexを取り出しましょう。headerとindexは以下の部分のことですね。先ほど同様にDataFrameをfor文で作ってみましょう。pd.DataFrame(list_dct)df【結果】indexを取り出します。step=1)次に、header部分を取り出します。Pythondf.columns1df.columns【結果】Pythondf.columns1df.columnsこれでDataFramの情報の表示の仕方についてまなぶことができました。DataFramのデータを取り扱うここからは、DataFrameに条件を加えて必要なデータを取り出したり、取り出したデータを加工する操作について学んでいきます。取り扱うDataFrameを確認しましょう。Pythondf1df1つの列のデータを取り出すa列のデータを取り出してみましょう。int641つの列のデータを取得したい場合はdf[‘指定の列名’]とすればよいです。1つの行を取り出すのであれば、dfの列名が属性として登録されるため以下のような書き方でも可能です。int64複数行のデータを取り出す次に、指定した複数の列のデータを取り出したい場合についてです。‘b’]と複数の列名を指定します。補足ですが、先ほどの1つの列のデータを取得する場合は、今回のようにリスト型として指定することもできます。Pythondf[['a']]1df[['a']]どうして角括弧[]が2つあるのかと疑問に思うかもしれませんが、リスト型が入ってdf[リスト型]という構造になっていると理解すれば良いです。行と列を指定する:iloc先ほどのような列名を指定する場合もあれば、今回のように行と列をことでデータを取り出すことができます。行と列を指定df.iloc[1:10,1:3]【結果】ilocのiがindex、locがlocation(場所)の略なので、どのindexの場所を取り出すか指定するものですね。ややこしいので、どうなっているのかを絵で解説します。注意ですが指定した行と列はindexが0から開始されるので、1行目はindexが0に対応します。ややこしいですが、indexが0から始まるのかと覚えたおかなければ間違ったデータを取得してしまいますのでご注意を!また、どこまで取り出すかも指定したindexより手前なので指定したindexより1つ手前のデータまでを取り出すという点もややこしいですが、そういった仕様であることを覚えておきましょう。行と列を指定する:locilocとlocがややこしいですが、locを指定することで行名や列名で指定してデータを取り出すことができます。今回はindexが数字なので以下のようにしても良いです。行と列のラベルを指定df.loc[1:10,['a','b']]【結果】ピンポイントで値を取り出す:atindexは数字なのでindexの数を指定し、列名は文字列で指定することでほしい値を取得できます。ピンポイントで値を取り出すdf.at[10,'b']【結果】Python11111また、少し前で示したようにindexが文字の場合の例も見ておきましょう。復習ですが文字をindexにする場合は以下のようにコードを書いてDataFrameを用意します。columns=columns)df_test【結果】そして、a行のy列の値(つまり2)を取得したい場合は以下のように書けばよいです。ピンポイントで値を取り出すdf.iat[10,1]【結果】Python11111DataFrameの加工ここまではDataFrameからデータを取り出すことを行いましたが、実際にはデータを加工して使うことが多いです。DataFrame動詞の足し算まずは2つのDataFrameを用意しましょう。columns=columns)【結果】どうなっているのか分からない人のために、解説を加えます。size=None)とすることで、lowからhighで指定した範囲の一様分布な確率で、sizeの数だけndarray配列を作ってくれます。今回は1~10までの数字を等確率で30個数字をランダムに選択しています。9])このようになってものを10行3列の配列に変えます。6]])2つのDataFrameであるdf_1とdf_2ができたので、各要素で足し算を行いましょう。列の追加df_1に次の新しいデータを追加してみましょう。新しい列の名前はdf_1「a+c」として、はdf_1のa列とdf_1のc列の出し残として追加します。次は行の削除を行いましょう。行の削除にはdropメソッドを使います。axis=0)としてことでindexが5の行が削除されました。これは削除を行ったものを表示しただけでdf_1そのものは何も変わっていません。念のためのdf_1を確認しましょう。列を削除したい場合は、dropメソッドの引数でaxis=1と指定すれば良いです。df_1で指定した列を削除した結果をDataFrameに反映したい場合は、inplace=Trueとしてやれば良いです。axis:0だと行を削除。条件にデータを絞るDataFrameに比較演算子をすることで、各要素がTrueかFalseになります。5【結果】この比較演算子によって出てきたデータをDataFrameに入れることで、条件にあったデータだけを数字で表示してくれます。5]【結果】どの列に対して条件を課すのかを示すことで、その列が条件に満たすものだけを表示してくれます。※これは以下のようにlocを使っても同じ結果になります。5]列に条件をかしつつ、抜き出したい列を指定したい場合は以下のように書きます。順番の並べ替えdf_1のa列を昇順(大きい値順)に並べ替えます。ascending=Trueにすればできます。上の例だとa列を昇順になったのですが、indexも並び変えられてしまいます。indexは並び変えたくない場合はreset_indexの引数にdrop=Trueと書けばよいです。ascending=False).reset_index(drop=True)【結果】2つのデータを結合する2つのDataFrameを結合する場合はconcatメソッドを使います。列(下側に追加する)か行(横側に追加する)かはaxisで指定する必要があります。デフォルトだとaxis=0であるため、列側にもうひとつのDataFrameが結合されます。pd.concat([df_1,df_2])df_conaxisを指定しない場合はaxis=0となり以下の結果となります。行に追加したい場合はaxis=1とします。axis=1)df_con【結果】DataFrameの色々な結合の仕方DataFrameの結合の仕方はconcat以外にもmergeメソッドというのがあります。2つの適当なDataFrameを作って試してみましょう。1つ目のDataFrameを作成します。pd.DataFrame(list_dct)df1【結果】もうひとつのDataFrameを作成します。共通している列名「e」について結合します。e列が同じ値の場合はそのまま横に結合します。以下のように結合されます。how=’outer’としているためe列の共通していない要素はNanと表示されます。共通していない部分もDataFrameのレコード(行)として残るということですね。共通している部分だけを結合する場合は、how=’inner’とすれば良いです。「how=」でどこを基準にして結合するかをしているだけなので、「how=’right’」として右側のDataFrame(df2)を基準にして結合することもできます。「how=left’」としてDataFrame(df1)を基準にして結合することもできます。how='left')df_merge【結果】NaNを別の要素に置き換えるNaNはデータとして取り扱うことができないので別の値に置き換えることがしばしばあります。その時に使うメソッドがfillnaです。先ほど結合したdf_mergeにはNaNがあったため別の要素に置き換えてみましょう。Pythondf_merge.fillna('NaNを置き換えた')1df_merge.fillna('NaNを置き換えた')【結果】NaNがあったとしてもデータ量を減らさないようにしたい場合は、とにかく統計量には影響を与えないようためにNaNのところに平均値を入れておく場合があります。DataFrameの列の平均はmeanメソッドで計算できます。float64では、NaNの部分を平均値に置き換えてみましょう。df_merge.fillna(df_merge.mean())df_merge【結果】DataFrameの要素のデータの型を変更するデータの要素の方を変えたい場合はastypeメソッドの引数にデータの型を指定して型を変更することができます。df_mergeのf_y、g_y、h_yは浮動小数点型(float型)になっているので、整数型(int型)に変更してみましょう。Pythondf_merge.astype(int)1df_merge.astype(int)【結果】グルーピングして統計量を計算するDataFrameの要素の中には同じカテゴリーにできるものがあり、その統計量を知りたい場合があります。以下のように「x,y,z」しかない要素を追加しましょう。「xが男性」「yが女性」「zがそれ以外(ニューハーフなど)」としましょう。x,y,zをカテゴリーにグルーピングをして最大値や平均値や標準偏差を見たい場合にはgroupeメソッドを使い、.(ドット)でつないで見た統計量を指定します。グルーピングの最大値を計算Pythondf_merge.groupby('common').max()1df_merge.groupby('common').max()【結果】グルーピングの平均値を計算Pythondf_merge.groupby('common').mean()1df_merge.groupby('common').mean()【結果】グルーピングの標準偏差を計算Pythondf_merge.groupby('common').std()1df_merge.groupby('common').std()【結果】DataFrameの統計量を見たい場合:describe列ごとの統計量を見たい場合はdescribeメソッドを使うと便利です。※数値以外のところは計算はできないため表示してくれません。Pythondf_merge.describe()1df_merge.describe()【結果】まとめpandasの属性やメソッドで使いそうなものを一通り紹介しました。これらは使っていれば自然と覚えるものなので、覚えきれなていない場合は「毎回、調べて使えればいいや」というくらいで良いと思います。kamakiri宇宙に入ったカマキリPythonPython(gspred)でスプレッドシートを操作する。kamakiri宇宙に入ったカマキリPython【Python初心者】クラスの継承の基本定義とコードの書き方を解説する。kamakiri宇宙に入ったカマキリPython【第15回Python流体の数値計算】2次元ポアソン方程式をPythonで実装する。コメントをキャンセルメールアドレスが公開されることはありません。付いている欄は必須項目です【例題演習】クラメルの公式を使って連立方程式を解く【掃き出し法】拡大係数行列を使って連立1次方程式を解く製造業コミュニティ製造業コミュニティは製造業で働く方や製造業へ就職を考えている学生の方が匿名で気軽に情報交換を出来るオンラインコミュニティです。本が聴けるアプリAudible(オーディブル)☟30日間の無料体験(最初の1冊は無料)プロフィールカマキリ(^^)大学の専攻は物性理論で、Fortranを使って数値計算をしていました。CAEを用いた流体解析は興味がありOpenFOAMを使って勉強しています。CAE解析(流体解析)notenoteで内容は主に「プログラミング言語」の勉強の進捗を書いています。「現在勉強中の内容」「日々思ったこと」も日記代わりに書き記しています。1DCAEの操作方法などを動画にしています。(音声はありません_(._.)_)製造業コミュニティをやっています。Facebookを使った実名登録。製造業ブロガーコミニティ案内オンライン家庭教師のご要望あればご連絡ください。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。・当メディアはGoogleによるユーザーに合わせた自動広告が表示されます。Twitterカマキリ☟こちら日々の「思ったこと」「勉強している内容」を発信しています。4Pythonを使ってTwitterAPIで自作botを作りました。製造業コミュニティの方々と運営しています。botを作るのかを知りたい方はこちら。【超丁寧に解説】Pythonを使ってTwitterAPIでGoogleスプレッドシートに書いた内容を画像付きでツイート投稿する。宇宙に入ったカマキリ。