Skip to content

DNET_Pandas

nishi_74322014 edited this page Sep 11, 2026 · 1 revision

Pandas

概要

Pandas(パンダス)は数表の形式で保存されたデータを効率的に処理する機能を収録したライブラリ

詳細

準備

インストール

>pip install pandas

インポート

>>>import pandas as pd

ファースト・ステップ(Series)

Series型は、一次元の配列のオブジェクト

生成(Series)

配列から

>>>pd.Series([3,7,10,13])
0     3
1     7
2    10
3    13
dtype: int64

NumPyから(Series)

NumPyの配列から

>>>numpy_array = np.array([3,7,10,13])
>>>pd.Series(numpy_array)
0     3
1     7
2    10
3    13
dtype: int64

コピー(Series)

>>>ss=pd.Series([3,7,10,13])
  • 以下は参照渡し

    >>>ss2=ss
    
  • コピーする場合は以下

    >>>ss2=ss.copy()
    

アクセス(Series)

>>>x=pd.Series([3,7,10,13])

インデックス(Series)

>>>x[1]
7

抽出(Series)

  • スライシング

    >>>x[1:3]
    
  • 配列でインデックスを指定
    以下ではnp.arrayを使っているが、普通の配列でも指定可能。

    >>>x[np.array([1,2])]
    
  • 比較演算

    • 5以上の値を調査。

      >>>x>=5
      0    False
      1     True
      2     True
      3     True
      dtype: bool
      
    • 5以上の値を抽出。

      >>>x[x>=5]
      1     7
      2    10
      3    13
      dtype: int64
      

※ インデックスにtrue, falseのSeriesが指定され抽出される。

配列

配列の取り出し

>>>x.values
array([ 3,  7, 10, 13], dtype=int64)

セカンド・ステップ(DataFrame1)

DataFrame型は、テーブル形式のデータ構造

生成(DataFrame)

辞書型から

>>> pd.DataFrame({
...      'xxx': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], # 長さ: 6
...      'yyy': [20, 34, 50, 12, 62, 22], # 長さ: 6
...      'zzz':['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'] # 長さ: 6
... })
  xxx  yyy  zzz
0  aaa   20  AAA
1  bbb   34  BBB
2  ccc   50  CCC
3  ddd   12  DDD
4  eee   62  EEE
5  fff   22  FFF

NumPyから(DataFrame)

NumPyの行列(2次配列)から → NP ⇔ DF型変換

CSVから

>>>df = pd.read_csv('hoge.csv')

※ サンプル・データ: temp.csv

Excelから

  • openpyxlが必要

    >!pip install openpyxl
    
  • Excel読込

    >>>df = pd.read_excel('hoge.xlsx')
    

※ サンプル・データ: temp.xlsx

コピー(DataFrame)

>>> df=pd.DataFrame({
...      'xxx': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], # 長さ: 6
...      'yyy': [20, 34, 50, 12, 62, 22], # 長さ: 6
...      'zzz':['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'] # 長さ: 6
... })
  • 以下は参照渡し

    >>>df2=df
    
  • コピーする場合は以下

    >>>df2=df.copy()
    

確認

先頭・後尾

アクセス(DataFrame)

>>> df=pd.DataFrame({
...     'xxx': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], # 長さ: 6
...     'yyy': [20, 34, 50, 12, 62, 22], # 長さ: 6
...     'zzz':['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'] # 長さ: 6
... })
>>> df
   xxx  yyy  zzz
0  aaa   20  AAA
1  bbb   34  BBB
2  ccc   50  CCC
3  ddd   12  DDD
4  eee   62  EEE
5  fff   22  FFF

先頭・後尾

  • 先頭

    • 先頭5行を出力(既定値)

      >>>df.head()
      
    • 先頭2行を出力(明示)

      >>>df.head(2)
      
  • 後尾

    • 後尾5行を出力(既定値)

      >>>df.tail()
      
    • 後尾2行を出力(明示)

      >>>df.tail(2)
      

インデックス(DataFrame)

  • 行指定

    >>>df.iloc[1]
    
  • 列指定
    NumPyと同様にスライシングが可能

    >>>df.iloc[:,1]
    
  • 行列指定

    • 行列番号

      >>>df.iloc[1,0]
      'bbb'
      
    • 行番号・列名

      >df.loc[1,'xxx']
      'bbb'
      

抽出(DataFrame)

  • スライシング

    • >>>df.iloc[2:4]
      
    • >>>df.iloc[:,1]
      
  • 配列でインデックスを指定
    以下ではnp.arrayを使っているが、普通の配列でも指定可能。

    • 行インデックス

      >>>df.iloc[np.array([2,3])]
      
    • 行&列インデックス

      >>>df.iloc[np.array([2,3]), np.array([1,2])]
      
  • 比較演算

    • 30以上のyyy列の値を調査。

      >>>df.yyy >= 30
      
    • 30以上のyyy列の値を抽出。

      >>>df[df.yyy >= 30]
      

    ※ インデックスにname=yyyのtrue, falseのSeriesが指定され抽出される。

行列

m行n列の二次元行列が取得できる。

>>>df.values

行指定(≒ 選択)

  • 1行指定する場合はSeries

    >>>df.iloc[2]
    xxx    ccc
    yyy     50
    zzz    CCC
    Name: 2, dtype: object
    
  • 複数行指定(行を配列で指定)する場合はDataFrame

    >>>df.iloc[[2]]
       xxx  yyy  zzz
    2  ccc   50  CCC
    

列指定(≒ 射影)

  • 1列指定する場合はSeries
    行はスライシングで全行指定。

    >>>df.loc[:,'yyy']
    0    20
    1    34
    2    50
    3    12
    4    62
    5    22
    Name: yyy, dtype: int64
    
  • 複数列指定(列を配列で指定)する場合はDataFrame

    • 行はスライシングで全行指定

      >>>df.loc[:,['yyy']]
         yyy
      0   20
      1   34
      2   50
      3   12
      4   62
      5   22
      
    • 列名のみ指定しても結果は同じ

      >>>df[['yyy']]
         yyy
      0   20
      1   34
      2   50
      3   12
      4   62
      5   22
      

編集

  • 行編集: axis=0
  • 列編集: axis=1

行追加

  • concatを使った例

    >>>row=pd.DataFrame({
               'xxx': 'ggg',
               'yyy': [45],
               'zzz': 'GGG'})
    
    >>> df=pd.concat([df,row],axis=0)
    >>> df
       xxx  yyy  zzz
    0  aaa   20  AAA
    1  bbb   34  BBB
    2  ccc   50  CCC
    3  ddd   12  DDD
    4  eee   62  EEE
    5  fff   22  FFF
    0  ggg   45  GGG
    
  • インデックス再設定

    >>>df.index=np.arange(len(df))
    >>> df
       xxx  yyy  zzz
    0  aaa   20  AAA
    1  bbb   34  BBB
    2  ccc   50  CCC
    3  ddd   12  DDD
    4  eee   62  EEE
    5  fff   22  FFF
    6  ggg   45  GGG
    

列追加

  • 簡単な例

    >>>df['XXX']=['X1','X2','X3','X4','X5','X6']
    >>>df
       xxx  yyy  zzz XXX
    0  aaa   20  AAA  X1
    1  bbb   34  BBB  X2
    2  ccc   50  CCC  X3
    3  ddd   12  DDD  X4
    4  eee   62  EEE  X5
    5  fff   22  FFF  X6
    
  • concatを使った例

    >>>col=pd.DataFrame({'YYY':['Y1','Y2','Y3','Y4','Y5','Y6']})
    >>>df=pd.concat([df,col],axis=1)
    >>>df
       xxx  yyy  zzz XXX YYY
    0  aaa   20  AAA  X1  Y1
    1  bbb   34  BBB  X2  Y2
    2  ccc   50  CCC  X3  Y3
    3  ddd   12  DDD  X4  Y4
    4  eee   62  EEE  X5  Y5
    5  fff   22  FFF  X6  Y6
    

行削除

>>>df=df.drop(2,axis=0)
>>> df
   xxx  yyy  zzz XXX YYY
0  aaa   20  AAA  X1  Y1
1  bbb   34  BBB  X2  Y2
3  ddd   12  DDD  X4  Y4
4  eee   62  EEE  X5  Y5
5  fff   22  FFF  X6  Y6

列削除

>>>df=df.drop('yyy',axis=1)
>>>df
   xxx  zzz XXX YYY
0  aaa  AAA  X1  Y1
1  bbb  BBB  X2  Y2
3  ddd  DDD  X4  Y4
4  eee  EEE  X5  Y5
5  fff  FFF  X6  Y6

列名・行名の変更

  • 列名の変更

    >>>df.columns=['AAA','BBB','CCC','DDD']
    >>>df
       AAA  BBB CCC DDD
    0  aaa  AAA  X1  Y1
    1  bbb  BBB  X2  Y2
    3  ddd  DDD  X4  Y4
    4  eee  EEE  X5  Y5
    5  fff  FFF  X6  Y6
    
  • 列名・行名の変更

    >>>df=df.rename(columns={'DDD': 'XXX'}, index={5: 'hoge'})
    >>>df
          AAA  BBB CCC XXX
    0     aaa  AAA  X1  Y1
    1     bbb  BBB  X2  Y2
    3     ddd  DDD  X4  Y4
    4     eee  EEE  X5  Y5
    hoge  fff  FFF  X6  Y6
    

列値の一括変更

列値を%に単位変更する(100倍する)などの一括変更。

>>>pd.DataFrame({
...      'xxx': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], # 長さ: 6
...      'yyy': [20, 34, 50, 12, 62, 22], # 長さ: 6
...      'zzz':['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'] # 長さ: 6
... })
>>>df.iloc[:,1:2] = df.iloc[:,1:2] * 100
   xxx   yyy  zzz
0  aaa  2000  AAA
1  bbb  3400  BBB
2  ccc  5000  CCC
3  ddd  1200  DDD
4  eee  6200  EEE
5  fff  2200  FFF
6  ggg  4500  GGG

行列の入替(転置)

df=df.transpose()

inplace=True

inplace=Trueを設定すると、元を変更する。

>>>df.drop('yyy',axis=1,inplace=True)
>>>df

※ drop、rename、dropnaなどメソッドに指定できる。

サード・ステップ(DataFrame2)

型変換

SS ⇔ DF型変換

  • DF → SS
    アクセスの所で幾らか説明済み。

  • SS → DF

    >>>df = pd.DataFrame(pd.Series([3,7,10,13]))
    >>>df
    

NP ⇔ DF型変換

  • NP → DF

    • NP初期化

      >>>np_arr=np.array([[1,2,3],[4,5,6]])
      
    • 列名付与

      >>>df=pd.DataFrame(np_arr,columns=['a','b','c'])
      
  • DF → NP

    • np.arrayメソッド

      >>>np_arr=np.array(df)
      
    • df.valuesプロパティ

      >>>np_arr=df.values
      

集計操作

>>>df=pd.DataFrame({
...    '0': ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09'], # 長さ: 10
...    '1': ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19'], # 長さ: 10
...    '2': ['20', '21', '22', '23', '24', '25', '26', '27', '28', '29'] # 長さ: 10
})
>>>df=df.astype('int')

行方向に集計

  • m~n列を行集計

    >>>ss_sum = df.iloc[:, m:n].sum(axis=0)
    >>>df_sum = pd.DataFrame(ss_sum)
    >>>df_sum = df_sum.rename(columns={0: 'sum'})
    
  • 集計行として追加

    >>>df=pd.concat([df,df_sum.transpose()],axis=0)
    >>>df
    

列方向に集計

  • m~n列を列集計

    >>>ss_sum = df.iloc[:,[1,2]].sum(axis=1)
    >>>df_sum = pd.DataFrame(ss_sum)
    >>>df_sum = df_sum.rename(columns={0: 'sum'})
    
  • 集計列として追加

    >>>df=pd.concat([df,df_sum],axis=1)
    

4thステップ(DataFrame3)

補完処理

基本的な補完処理

データマイニング(DM)- Pythonの該当節を参照。

Xを含む要素を一括置換

  • Xを含む要素をXで一括置換

    >>>df['列名'] = df['列名'].str.replace('.*(置換前).*', '置換後', regex=True)
    
  • 要素を要素中の[,]と[.]で囲まれた文字列で一括置換

    list_col1 = [i.split(",")[1].split(".")[0].strip() for i in df["col1"]]
    df["col1"] = pd.Series(list_col1)
    nparr_col1 = df["col1"].unique()
    for cell in nparr_col1:
       df['col1'] = df['col1'].str.replace('.*({0}\.).*'.format(cell), cell, regex=True)

グループの平均値で補完

>>>df['補完対象列名'] = df.groupby('グループ化列名')['補完対象列名'].transform(lambda d: d.fillna(d.mean()))

特徴量の選択とエンジニアリング

特徴量の選択とエンジニアリングとは?(機械学習(machine learning)の該当節を参照)

基本統計量

  • 通常

    >>>df.describe()
    
  • 小数点以下、切捨

    >>>df.describe().astype(int)
    

相関係数行列

説明変数の表(DataFrame)から相関係数行列を生成。

>>>df.corr()

※ ヒートマップで可視化する方法はコチラの該当節。

散布図行列

説明変数の表(DataFrame)を散布図行列(Matplotlibの該当節を参照)として可視化。

DataFrameで標準化

>>>X = (df.iloc[:, m:n] - df.iloc[:, m:n].mean()) / df.iloc[:, m:n].std()
>>>X.describe()

※ 平均が ≒ 0、標準偏差 ≒ 1 になればOK。

One-Hotエンコーディング

  • カテゴリを列に展開(0・1化)など。

    pd.get_dummies(df['カテゴリ列の列名'])
    
  • 展開した列を表に追加する流れ

    df_dummy = pd.get_dummies(df['カテゴリ列の列名'])
    df = pd.concat([df, df_dummy], axis=1)
    df.head()
    

参考

移行メモ

  • 「SS ⇔ DF型変換」の 2 項目のラベルが入れ替わっていた。 「アクセスの所で説明済み」なのは DataFrame から Series を取り出す操作(DF → SS)、 pd.DataFrame(pd.Series(...)) は Series から DataFrame を作る操作(SS → DF)のため、 ラベルを入れ替えた。
  • 「集計操作」で、行方向(axis=0)の集計結果は「集計行」として、 列方向(axis=1)の集計結果は「集計列」として追加されるが、 ラベルが逆になっていたため入れ替えた。あわせて見出し「行方向に集系」→「行方向に集計」。
  • df.iloc[:,[m:n]] は Python の構文として誤りのため df.iloc[:, m:n] に修正した。
  • 「要列名付与」→「列名付与」、 「先頭2行を出力(明示)」が df.tail(2) の説明に付いていたため「後尾2行」に修正した。
  • 「5より大きい値」「30より大きい値」の例は条件が >=(以上)のため 「5以上の値」「30以上の値」に改めた。
  • 「列値の一括変更」の実行結果に、直前の DataFrame(6 行)には存在しない 7 行目(ggg)が含まれている(元 Wiki の記載どおり)。
  • 元 Wiki の「戻る」の並びで Pandas が HTML 実体参照(Pandas)で 書かれていたが、PukiWiki のページ内リンク自動生成を避けるための記法と 思われるため、通常の文字列に戻した。
  • 同名の見出し(「生成」「アクセス」「インデックス」「抽出」「コピー」「NumPyから」)が 複数あり、GitHub Wiki ではアンカが衝突するため、括弧で文脈を補って一意にした。
  • 添付 2 点は、元 Wiki では本文から参照されていなかったが、 CSV / Excel 読込のサンプル・データと思われるため、 DNET_Pandas_temp.csv / DNET_Pandas_temp.xlsx として取得し、当該節から参照した。

Tags: 移行, Pandas, Python, DataFrame, Series, データ解析, 集計, One-Hot, NumPy

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally