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

  1. import pandas as pd
  2. #結合
  3. # ABでkey列の共通したデータだけ抽出し結合
  4. df=pd.merge(dfA, dfB, on='key')
  5. #left指定で最初(左側)のデータフレームは全て残す
  6. df=pd.merge(dfA, dfB, on='key', how='left')
  7. #縦に連結(列の重複なし、index重複あり)
  8. df=pd.concat([dfA, dfB, dfC])
  9. #横に連結(列の重複あり、index重複なし)
  10. df=pd.concat([dfA, dfB], axis=1)
  11.  
  12. #要素数カウント
  13. df.size
  14. #A列のユニーク要素数カウント
  15. df['A'].value_counts()
  16. #要素指定
  17. df.iloc[行番号][列番号]
  18. df.iloc[:,3:]
  19. df.loc[行名, 列名]
  20. df[列名][行名]
  21.  
  22. #条件検索、操作(行削除、行抽出、要素置換)
  23. #値を検索して該当行削除・抽出
  24. #A列が-1の行を削除(-1でない行を抽出)
  25. df=df[df['A'] != -1]
  26. #A列が1000より大きな行を削除(1000以下を抽出)
  27. df=df[df['A'] <= 1000]
  28. #'くだもの'列から3種指定し行抽出(その他削除)
  29. df=df[(df['くだもの'] == 'りんご')|
  30. (df['くだもの'] == 'いちご')|
  31. (df['くだもの'] == 'めろん')]
  32. #値を検索して置換
  33. #A列が0の時は0、それ以外は1で行全体を置換
  34. df=df.where(df['A'] == 0, 1)
  35. #A列が0の時は0、それ以外は1でA列のみ置換
  36. df['A']=df['A'].where(df['A'] == 0, 1)
  37.  
  38. #Nan
  39. #A列の要素がNanならTrue判定。B列を追加
  40. df['B']=df['A'].isnull()
  41. #A列の要素がNanなら'aaa'で穴埋め
  42. df['A']=df['A'].fillna('aaa')
  43. #要素抽出
  44. #dfAとdfBの0列を比較し、BにないAの要素を抽出
  45. dfA[~dfA[0].isin(dfB[0])]
  46. #最大最小抽出
  47. df['A'].idxmax() #A列最大値の行名抽出
  48. df['A'].idxmin() #A列最小値の行名抽出
  49. df['A'].max() #A列最大値抽出
  50. df['A'].min() #A列最小値抽出
  51.  
  52. #累積
  53. #行方向累積和-B列追加
  54. df['B']=df['A'].cumsum()
  55. #列方向累積和
  56. df.cumsum(axis=1)
  57. #行方向最大値維持
  58. df.cummax()
  59. #累積積
  60. df.cumprod()
  61.  
  62. #行抽出
  63. df.iloc[行番号]
  64. df.loc[行名]
  65. #行追加
  66. df=df.append(aaa, ignore_index=True) #aaa=[・・・]
  67.  
  68. #行名ふり直し
  69. #0から連番で振り直し
  70. df=df.reset_index(drop=True)
  71. #指定
  72. #0,3,5→idx=[0,1,2,3,4,5]
  73. df=df.reindex(idx, fill_value=0)
  74. #列名取得
  75. df.columns
  76. df.columns.tolist()
  77. #列名変更
  78. df.columns = ['A', 'B', 'C']
  79. #列名・行名一部変更
  80.   df.rename(columns={'A': 'a'},
  81.             index={'B': 'b'},
  82.            inplace=True)
  83. #列並べ替え
  84. df=df[['C', 'A', 'B']]
  85.  
  86. #行削除
  87. df=df.drop(['A'])
  88. #列削除
  89. df=df.drop(['A'],axis=1)
  90.  
  91. #集計
  92. df.values.sum() #全合計
  93.  
  94. #集約
  95. pd.crosstab(df['A'], df['B'])
  96. df.groupby(['A','B']).size().unstack('B', fill_value=0)
  97. pd.pivot_table(df, index=['A'], columns=['B'],
  98. aggfunc=len, fill_value=0)
  99.  
  100. #時間
  101. #時間型に変換
  102. df['date']=pd.to_datetime(df['date'])
  103. #列を結合し、date列作成
  104. df['date'] = pd.to_datetime(df['西暦'].astype(str)+'/'+
  105. df['月'].astype(str)+'/'+
  106. df['日'].astype(str)+'/'+
  107. df['時刻'].astype(str),
  108. format='%Y/%m/%d/%H:%M:%S')
  109. #時刻が書かれていなければ0時を記入
  110. df['時刻']=df['時刻'].fillna('00:00:00')
  111. #丸め
  112. #時間単位でround up
  113. df['date']=df['date'].dt.ceil("H")
  114. #30分単位でround
  115. df['date']=df['date'].dt.round('30min')
  116. #時間単位でround down
  117. df['date']=df['date'].dt.floor('30min')
  118. #日付を四半期表示に変換
  119. dfQ=pd.PeriodIndex(df['date'], freq='Q')
  120. #四半期データ作成(期間指定)
  121. df['date']=pd.period_range(
  122.    start=pd.Period('2008Q1', freq='Q'),
  123. end=pd.Period('2019Q4', freq='Q'),
  124. freq='Q')
  125. #LOOP処理
  126. #行を順に処理
  127. for index, row in df.iterrows()
  128.  #iteritems()→カラム名、カラムのデータ(Series形状)を返す
  129. #iterrows() →ラベル名、ラベルのデータ(Series形状)を返す
  130. #DataFrame作成
  131. #列名を決めた空のdf作成
  132. df= pd.DataFrame(index=[], columns=['A', 'B', 'C'])
  133. #データから作成
  134. import numpy as np
  135. x, y, z, v = np.random.random((4, 1000))*100
  136. df=pd.DataFrame({'x':x,'y':y,'z':z,'v':v})
  137. #クリップボードから作成
  138. df = pd.read_clipboard()
  139.  
  140. #不要データフレーム削除
  141. del(df1,df2)
  142.  
  143.  

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

0 件のコメント:

コメントを投稿