Pythonバイオ? 
42   2019-08-16 (金) 10:15:52

pandasティップス

行選択と列選択

行位置選択

行の値選択、列の値選択

セル選択

行演算と列演算

NaN扱い

NaNはnumpyのnan

DFでなければ

if np.isnanUnp.nan):
    hogehoge

DFでのnan判定

Reference→API reference のgeneral functionにある

df = pd.DataFrame8{[1,3],[2,np.nan]])
print(df.isnull())
print(df.notnull())

なお、isnull()はisna()のalias、notnull()はnotna()のalias

初めに空のDataFrameを作って後からデータ行を足す

df = pd.DataFrame( columns=['A', 'B'] )
for u in [0, 1, 2, 3]:
    temp_series = pd.Series( [i, i*i], index=df.columns )
    df = df.append( temp_series, ignore_index=True )

read_csvとto_csv

read_csv

pandasでcsv/tsvファイル読み込み(read_csv, read_table) | note.nkmk.me
pandas.read_csv — pandas 0.25.0 documentation
codecs — Codec registry and base classes — Python 3.7.4 documentation

import pandas as pd
pd.read_csv('filename', sep='\t', header=0, skiprows=[], encoding='cp932')

または

with open('filename', 'r', encoding='...') as fin:
    pd.read_csv(fin, ... )

to_csv

df = ...
df.to_csv('filename', ...)

read_excelとto_excel

pandas.DataFrame.to_excel — pandas 0.25.0 documentation

If you wish to write to more than one sheet in the workbook, it is necessary to specify an ExcelWriter object:

>>> df2 = df1.copy()
>>> with pd.ExcelWriter('output.xlsx') as writer:  # doctest: +SKIP
...     df1.to_excel(writer, sheet_name='Sheet_name_1')
...     df2.to_excel(writer, sheet_name='Sheet_name_2')

ヒストグラム

散布図

ヒートマップ

階層的クラスタリング

import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.spatial.distance import pdist
import matplotlib.pyplot as plt
X = np.array([[1,2], [2,1], [3,4], [4,3]])
Z = linkage(X, 'single')  # ward法を使うならば 'single' の代わりに 'ward' を指定する
dendrogram(
    Z,
    leaf_font_size=8.,  # font size for the x axis labels
)
plt.show()
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram
df_count_tpm = pd.read_csv("count_tpm.tsv", sep="\t", index_col=0)
tpm_t = df_count_tpm.T
print(df_count_tpm.head())
from scipy.spatial.distance import pdist
linkage_result = linkage(tpm_t, method='average', metric='correlation')
plt.figure(num=None, figsize=(16, 9), dpi=200, facecolor='w', edgecolor='k')
dendrogram(linkage_result, labels=df_count_tpm.columns)
plt.show()

k-means法によるクラスタリング

mySQLアクセス

def read_db(query):
    engine = create_engine('mysql+mysqldb://userid:password@localhost/dbname?charset=utf8',\
                           echo=False)
    dfr = pd.io.sql.read_sql(query, engine)
    return(dfr)

query = 'select * from tablename'
df = read_db(query)

ファイルの存在

import os
path = "./sample"
os.path.exists(path)

pickle

with open(picklefname, 'rb') as pf:
    df = pickle.load(pf)
with open(picklefname, 'wb') as pwf:
    pickle.dump(df, pwf)

条件式(3項演算子)

x = "OK" if n == 10 else "NG"

文字列のリストを繋いで1つの文字列にする

s = ''
for u in list:
   s += u

'間に挿入する文字列'.join([連結したい文字列のリスト])

s = ''.join(list)

文字列の検索

>>> "spam".find("pa")
1
>>> "spam".find("x")
-1

indexは見つからないときにエラーを返す

Seriesに2引数の関数をapplyする場合

df.x.apply(f1, args=(2,))
# または、 apply にキーワード引数で与える
df.x.apply(f1, b=2)

DF内の検索

df[X].isin([list])  listでなければならない。

pandasで任意の位置の値を取得・変更するat, iat, loc, iloc

https://note.nkmk.me/python-pandas-at-iat-loc-iloc/

argv, argc

import sys
argvs = sys.argv;
argc = len(argvs)
if (argc != 2):
    print('Usage: python %s filename' % argvs[0])
    quit()

リストのソート

newls = sorted(list)

メソッドsortはin-placeでソートするので注意。

list.sort()  # listそのものが置き換わる

グローバル変数

https://uxmilk.jp/12505

var = 1
def add_ten(x):
    global var
    var = 10
    print var + x
 
add_ten(2)    # 12
print var     # 10

リストの差分

https://python.ms/sub/optimization/if-vs-try/list-deletion/#_6-1-1-%E6%AF%94%E8%BC%83%E5%AF%BE%E8%B1%A1

def subtract_list(lst1, lst2):
    lst = lst1.copy()
    for e2 in lst2:
        try:
            lst.remove(e2)
        except ValueError:
            continue
    return lst

ifでチェックするより早い

型のチェック

特にNaNがあると、NaNはfloat型だと思い込むので、後の処理でぶつかることがある。

その時に、型チェックで逃げるとすると、(pandas的には個別の型チェックよりはdropnaなどの方がいいと思うが)必要になる。

Pythonで型を取得・判定するtype関数, isinstance関数 | note.nkmk.me

なのだが、isinstance()の方がよさそうだ。typeで引っかかない場合がある。

列の型変換

df['innings'].astype(np.int64)

リストの任意の位置への項目挿入

list.insert(位置, 値)

リストを置き換えるので注意

おまけ bashのループ

#!/usr/bin/bash
samples=("Anc" "1_2-1" "2_2-1" "2_5-1" "2_5-1-7A" "1_2-2" "2_2-2" "2_6-2" "2_6-2-10E")
for f in "${samples[@]}"
do
  #nohup python ProcessGD.py $f > $f.out &
  echo $f
done

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-16 (金) 10:15:52 (9d)