先日、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 件のコメント:
コメントを投稿