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