uso

雑記いろいろ
★書いてある内容に保証は一切ありません。
 ご自身で判断をしてください。

pythonの勉強

2019-11-01 14:44:14 | work
久しぶりに勉強したら、3.8になってたorz


Windowsの軽量版、こっそり使いたいけど勝手が違う。
python-3.8.0-embed-amd64.zip

ここのサイトを見ながら使えるように(pandas動く)したい
https://qiita.com/mm_sys/items/1fd3a50a930dac3db299


■インストール?

解凍、exeがあるとこでpython起動→インタラクティブ
終了quit()もexit()もエラー

exitする方法(まさかこんなことに困ると思わなかった)
https://takamaruo.hatenablog.com/entry/2018/10/09/232304

from sys import exit
exit()

■pip使えるようにする

python.exeと同じ場所にあるpython38._pthを編集
 #import site → コメント解除

get-pip.pyを取得しpython.exeと同じ場所に配置
https://bootstrap.pypa.io/get-pip.py

コマンドプロンプトを起動し、一時的に以下のパスを通す(こっそりだから)
path →確認
set path=%path%;python.exeがある場所\Scripts

python get-pip.py
→パスを通してないとWarning出る
 ※コマンドは必ずpython.exeがあるところですること

pipがインストールされたか見る
python -m pip list

Package Version
---------- -------
pip 19.3.1
setuptools 41.6.0
wheel 0.33.6

ここにpipが入った
python.exeのあるフォルダ\Scripts\pip.exe
pipでインストールを試す
pip install numpy

ここにnumpyが入る
python.exeがあるフォルダ\Lib\site-packages\numpy

本命のpandas入れる
pip install pandas

pipのインストール一覧を見る
pip list

Package Version
--------------- -------
numpy 1.17.3
pandas 0.25.2
pip 19.3.1
python-dateutil 2.8.0
pytz 2019.3
setuptools 41.6.0
six 1.12.0
wheel 0.33.6


こそこそやってるつもりだが、
C:\Users\ユーザー\AppData\Local\pipがあり、キャッシュフォルダとかできてしまう
むずかしい。。


■ばれないようにドロン
python.exeなどを入れたフォルダごと消す


ここからはpandasとエクセルの話


■エクセルをpandasで読み取る

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html

xlrdがいるのでインストール
pip install xlrd

エクセル準備
test.xlsx
hoge1 hoge2 hoge3
1 ほげ 2019-11-01
2 ふが NaT
3 NaN 2019-11-01

以下実行

>>> import pandas as pd
>>> df = pd.read_excel('test.xlsx')
>>> print(df)
hoge1 hoge2 hoge3
0 1 ほげ 2019-11-01
1 2 ふが NaT
2 3 NaN 2019-11-01

こんな感じ。

■pandasのDataFrameについてもう少し

カラムの一覧取得
>>> print(df.columns)
Index(['hoge1', 'hoge2', 'hoge3'], dtype='object')

カラムのデータ型を取得
>>> print(df.dtypes)
hoge1 int64
hoge2 object
hoge3 datetime64[ns]
dtype: object


型を指定してエクセルを読み込む場合
https://note.nkmk.me/python-numpy-dtype-astype/
>>> df2 = pd.read_excel('test.xlsx', dtype={'hoge1':object, 'hoge3':object})
>>> print(df2.dtypes)
hoge1 object
hoge2 object
hoge3 datetime64[ns]
dtype: object

一気に全部の型を指定(objectなら一気に行けそうだが、ほかの型は微妙)
>>> df3 = pd.read_excel('test.xlsx', dtype='object')
>>> print(df3.dtypes)
hoge1 object
hoge2 object
hoge3 datetime64[ns]
dtype: object


空セルのNaNを変換
>>> df.fillna('')
hoge1 hoge2 hoge3
0 1 ほげ 2019-11-01 00:00:00
1 2 ふが
2 3 2019-11-01 00:00:00
dtype: object

↑の場合、戻り値指定していないため、dfはNaNのまま!
df=df.fillna('')
こうするとdfが上書きされる

■脱線するがdfの比較をする方法
 これでエクセルファイルの比較をした

https://hack-le.com/pandas-2-true-false-10/

dfとdf2を比較する
>>> print(df)
hoge1 hoge2 hoge3
0 1 ほげ 2019-11-01
1 2 ふが NaT
2 3 NaN 2019-11-01
>>> print(df2)
hoge1 hoge2 hoge3
0 1 ほげ 2019-11-01
1 2 ふが NaT
2 3 NaN 2019-11-01
>>> print(df.dtypes)
hoge1 int64
hoge2 object
hoge3 datetime64[ns]
dtype: object
>>> print(df2.dtypes)
hoge1 object
hoge2 object
hoge3 datetime64[ns]
dtype: object

dfとdf2をキーhoge1でマージ(複数キー指定の場合はこうする→on=['key1', 'key2'])
>>> dfmg=pd.merge(df,df2, on='hoge1', how='inner')
>>> print(dfmg)
hoge1 hoge2_x hoge3_x hoge2_y hoge3_y
0 1 ほげ 2019-11-01 ほげ 2019-11-01
1 2 ふが NaT ふが NaT
2 3 NaN 2019-11-01 NaN 2019-11-01

列同士を比較し結果を入れる列を作成
>>> dfmg['hoge2_comp']=(dfmg['hoge2_x']==dfmg['hoge2_y'])
>>> dfmg['hoge3_comp']=(dfmg['hoge3_x']==dfmg['hoge3_y'])
>>> print(dfmg)
hoge1 hoge2_x hoge3_x hoge2_y hoge3_y hoge2_comp hoge3_comp
0 1 ほげ 2019-11-01 ほげ 2019-11-01 True True
1 2 ふが NaT ふが NaT True False
2 3 NaN 2019-11-01 NaN 2019-11-01 False True

hoge3が一致しない行だけ抽出し、一致しなかった値を出力
>>> r=dfmg['hoge3_comp']==False
>>> print(dfmg.loc[r,['hoge1','hoge3_x','hoge3_y']])
hoge1 hoge3_x hoge3_y
1 2 NaT NaT

NaTとかNaNは比較するとNGになる?ちゃんと消してから比較しないとダメ。
わざわざMergeしなくても比較できそうだが、
必ずしもデータが一致していないエクセルの比較だったのでMergeした


■python3.8について

新しい機能が増えててショック・・・

・セイウチ演算子
  変数への代入と変数の使用を同時に行える
  >>> a = 'hoge'
  >>> (n := len(array)) > 4
  False
  ※代入して比較する際にはセイウチ演算子の範囲をかっこで囲む必要あり

ほかにもあるがとりあえずまた今度。




最新の画像もっと見る