2020年2月15日土曜日

pandas DataFrame 操作

先日、pandas が 1.0 に Ver.UP。
痒いところに手の届く機能が追加されました。ありがたい。

過去、いくつか備忘録としてまとめていますが、コードとテキストが区別されてておらず見難かったため修正しました。このあたり↓
pandas データI/O:https://phreeqc.blogspot.com/2019/02/python3-io.html
df 内容確認:https://phreeqc.blogspot.com/2019/02/python3_62.html
データ型:https://phreeqc.blogspot.com/2019/02/python3.html
ファイル操作:https://phreeqc.blogspot.com/2019/02/python3_54.html

DataFrame 関連でよく使う基本操作を、以下にまとめ直しました。
なお、先頭のインデントは見やすさだけで付けたものです。使用時は外す必要があります。

import pandas as pd
#結合
 # ABでkey列の共通したデータだけ抽出し結合
 df=pd.merge(dfA, dfB, on='key')
 #left指定で最初(左側)のデータフレームは全て残す
 df=pd.merge(dfA, dfB, on='key', how='left')
 #縦に連結(列の重複なし、index重複あり)
 df=pd.concat([dfA, dfB, dfC])
 #横に連結(列の重複あり、index重複なし)
 df=pd.concat([dfA, dfB], axis=1)

#要素数カウント
  df.size
  #A列のユニーク要素数カウント
  df['A'].value_counts()
 
#要素指定
  df.iloc[行番号][列番号]
  df.iloc[:,3:]
  df.loc[行名, 列名]
  df[列名][行名]

#条件検索、操作(行削除、行抽出、要素置換)
  #値を検索して該当行削除・抽出
    #A列が-1の行を削除(-1でない行を抽出)
    df=df[df['A'] != -1]
    #A列が1000より大きな行を削除(1000以下を抽出)
    df=df[df['A'] <= 1000]
    #'くだもの'列から3種指定し行抽出(その他削除)
    df=df[(df['くだもの'] == 'りんご')|
          (df['くだもの'] == 'いちご')|
          (df['くだもの'] == 'めろん')]
  #値を検索して置換
    #A列が0の時は0、それ以外は1で行全体を置換
    df=df.where(df['A'] == 0, 1)
    #A列が0の時は0、それ以外は1でA列のみ置換
    df['A']=df['A'].where(df['A'] == 0, 1)

#Nan
  #A列の要素がNanならTrue判定。B列を追加
  df['B']=df['A'].isnull()
  #A列の要素がNanなら'aaa'で穴埋め
  df['A']=df['A'].fillna('aaa')
 
#要素抽出
  #dfAとdfBの0列を比較し、BにないAの要素を抽出
  dfA[~dfA[0].isin(dfB[0])]
 
#最大最小抽出
  df['A'].idxmax() #A列最大値の行名抽出
  df['A'].idxmin() #A列最小値の行名抽出
  df['A'].max() #A列最大値抽出
  df['A'].min() #A列最小値抽出

#累積
  #行方向累積和-B列追加
  df['B']=df['A'].cumsum()
  #列方向累積和
  df.cumsum(axis=1)
  #行方向最大値維持
  df.cummax()
  #累積積
  df.cumprod()

#行抽出
 df.iloc[行番号] 
 df.loc[行名]
 
#行追加
  df=df.append(aaa, ignore_index=True) #aaa=[・・・]

#行名ふり直し
  #0から連番で振り直し
  df=df.reset_index(drop=True)
  #指定
  #0,3,5→idx=[0,1,2,3,4,5]
  df=df.reindex(idx, fill_value=0) 
#列名取得
  df.columns
  df.columns.tolist()
 
#列名変更
  df.columns = ['A', 'B', 'C']
#列名・行名一部変更
  df.rename(columns={'A': 'a'},
            index={'B': 'b'},
            inplace=True)
#列並べ替え
  df=df[['C', 'A', 'B']]

#行削除
  df=df.drop(['A'])
 
#列削除
  df=df.drop(['A'],axis=1)

#集計
  df.values.sum() #全合計

#集約
  pd.crosstab(df['A'], df['B'])
  df.groupby(['A','B']).size().unstack('B', fill_value=0)
  pd.pivot_table(df, index=['A'], columns=['B'],
                 aggfunc=len, fill_value=0)

#時間
  #時間型に変換
  df['date']=pd.to_datetime(df['date'])
  #列を結合し、date列作成
  df['date'] = pd.to_datetime(df['西暦'].astype(str)+'/'+
                              df['月'].astype(str)+'/'+
                              df['日'].astype(str)+'/'+
                              df['時刻'].astype(str),
                              format='%Y/%m/%d/%H:%M:%S')       
  #時刻が書かれていなければ0時を記入
  df['時刻']=df['時刻'].fillna('00:00:00')
  #丸め
    #時間単位でround up
    df['date']=df['date'].dt.ceil("H")
    #30分単位でround
    df['date']=df['date'].dt.round('30min')
    #時間単位でround down
    df['date']=df['date'].dt.floor('30min')
  #日付を四半期表示に変換
  dfQ=pd.PeriodIndex(df['date'], freq='Q')
  #四半期データ作成(期間指定)
  df['date']=pd.period_range(
   start=pd.Period('2008Q1', freq='Q'), 
      end=pd.Period('2019Q4', freq='Q'), 
      freq='Q')
#LOOP処理
  #行を順に処理
  for index, row in df.iterrows()
 #iteritems()→カラム名、カラムのデータ(Series形状)を返す
  #iterrows() →ラベル名、ラベルのデータ(Series形状)を返す
 
#DataFrame作成
  #列名を決めた空のdf作成
  df= pd.DataFrame(index=[], columns=['A', 'B', 'C'])
  #データから作成
  import numpy as np
  x, y, z, v = np.random.random((4, 1000))*100
  df=pd.DataFrame({'x':x,'y':y,'z':z,'v':v})
  #クリップボードから作成
  df = pd.read_clipboard()

#不要データフレーム削除
  del(df1,df2)


20200216追加・修正
20200311追加・修正
20200610追加
20210206追加 引用:集約関数

0 件のコメント:

コメントを投稿