技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

pandasで重複数をカウントする

pandasで重複数をカウントしたい時、
例えばこんなデータがあったとする。

import pandas as pd
 
df = pd.DataFrame([['AA',100],['AA',200],['AA',200],
                  ['BB',100],['BB',200]],columns=['x','y'])
#---------------
#     x    y
# 0  AA  100
# 1  AA  200  
# 2  AA  200  
# 3  BB  100
# 4  BB  200
#-----------------

xの列はAAが3つBBが2つある。
これを

a = {"AA":3, "BB":2}

のように表現したい。

for文を使ってなんとかする方法は一つある。

a = dict()
for index, row in df.iterrows():
    if a.has_key(row["x"]):
        a[row["x"]] += 1
    else:
        a[row["x"]] = 1
#In : a
#Out: {'AA': 3, 'BB': 2}

しかしこれでは、行数が大きくなってくると時間がかかってしまう。
実はpandasではこれを高速で行う方法がある。
applyという関数を使う方法だ。

a = dict()
def b(i):
    if a.has_key(i):
        a[i] += 1
    else:
        a[i] = 1
df["x"].apply(lambda x:b(x))
#In : a
#Out: {'AA': 3, 'BB': 2}

これで高速に重複カウントができる。



参考サイト:
DataFrame や Series の重複データをチェック・削除-python | コード7区
Python pandas データのイテレーションと関数適用、pipe - StatsFragments

pythonでgraphvizの使い方(美しいツリー構造や状態遷移図の描画)

pythonで美しいグラフ構造を書くためのツール。

pythonでグラフ構造を書くといえば、今有名なのはnetworkxだろう。
でもnetworkxは描画には特化していない。どちらかというと分析に使うツールだ。
特に、状態遷移図や木構造を書くのには向いていない。
そこで登場するのがgraphviz
もともとgraphvizは独立したツールとして存在するが、pythonでラッパーが用意されている。

インストール

まずgraphvizそのもののダウンロードが必要。
Download | Graphviz
そしてライブラリをインストール

pip install graphviz

簡単な使い方

from graphviz import Digraph

G = Digraph(format="png")
G.attr("node", shape="square", style="filled")
G.edge("start","state1",label="0.8")
G.edge("start","state2",label="0.2")
G.edge("state1","state1",label="0.5")
G.edge("state2","state2", label="0.8")
G.edge("state1","state2",label="0.5")
G.edge("state2","end",label="0.2")
G.edge("end","count",label="1.0")
G.edge("count","start",label="1.0")
G.node("start", shape="circle", color="pink")
G.render("graphs")


有向グラフを書きたい時はDigraph、無向グラフを書きたい時はGraphを使用する。
基本的な流れは

  1. Digraph(Graph)で空のグラフを作る。画像として保存したい場合formatで保存形式を決められる,png,pdf,など。
  2. attr()で追加するノードの形などのスタイルを決める
  3. edge()でエッジを追加していく。この時、存在しないノードは自動的に追加される。
  4. 必要であればnode()でノードを追加したり、ラベル(表示名)を変更したりできる。
  5. render()で画像として保存。filenameでファイル名を指定

もちろんこんな木構造のグラフも書ける。

from graphviz import Digraph

G = Digraph(format="png")
G.attr("node", shape="circle")
edges = [(0, 1), (0, 95), (1, 2), (1, 4), (1, 94), (2, 3), (4, 5), (4, 92), (5, 6),
(6, 7), (6, 79), (6, 90), (6, 91), (7, 8), (7, 34), (7, 76), (7, 78), (8, 9), (8, 10), (8, 11),
(11, 12), (12, 13), (12, 28), (12, 29), (13, 14), (13, 21), (13, 25), (13, 26), (14, 15), (14, 17), (14, 18), (14, 20),
(15, 16), (18, 19), (21, 22), (21, 24), (22, 23), (26, 27), (29, 30), (30, 31), (31, 32), (31, 33),
(34, 35), (34, 70), (34, 71), (34, 72), (35, 36), (35, 37), (35, 56), (35, 64), (37, 38), (37, 53), (37, 55),
(38, 39), (39, 40), (40, 41), (40, 44), (40, 47), (40, 51), (40, 52), (41, 42), (42, 43), (44, 45), (44, 46),
(47, 48), (48, 49), (49, 50), (53, 54), (56, 57), (57, 58), (57, 59), (59, 60), (60, 61), (60, 62), (60, 63),
(64, 65), (64, 66), (66, 67), (66, 69), (67, 68), (72, 73), (73, 74), (74, 75), (76, 77), (79, 80), (80, 81), (80, 87),
(81, 82), (81, 86), (82, 83), (82, 84), (82, 85), (87, 88), (88, 89), (92, 93), (95, 96), (95, 98), (96, 97),
(98, 99), (98, 100), (98, 101), (101, 102), (102, 103), (103, 104), (103, 105), (105, 106), (105, 107), (105, 108)]
for i,j in edges:
    G.edge(str(i), str(j))
G.render("tree")


公式サイト

色を付けたり形を変えたり枠を囲ったり、やろうと思えば結構自由度が高い。
一番はやっぱり公式のリファレンスを見ることだろう。
User Guide — graphviz 0.20.1 documentation
Examples — graphviz 0.20.1 documentation
公式の例に従えばこんな綺麗なグラフも描ける。

それではよいグラフ描画ライフを!


関連記事:

sshを介してファイルのやり取り(sftp)

sftpの使い方メモ

サーバーに入るのはSSHと同じ要領

sftp [サーバー名]

でサーバーに入る。

exit

でsftpを終了。

サーバーからローカルにファイル転送

  • ファイル転送
get [ファイル名]

基本的に先頭に"l"をつけるだけ

lls    #localのls
lcd    #localのcd
lmkdir #localのmkdir
lpwd   #localのpwd

ローカルからサーバーにファイル転送

put [ファイル名]


参考サイト:
ネットワーク管理の基本Tips:SSHを介してファイル転送を行うには? sftpコマンド - @IT