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