変数 v が np.nan かどうかは、np.isnan(v) でできるが、vがfloatでないとエラーになる。
vがfloat以外も取りうるとき、v is np.nan としたくなるが、正しくない。
DataFrameならば、fillnaで空白とかにすればよいだろう。そうでないならば、isinstance(v,float) and np.isnan(v)とすればよい。

やってみた。
https://qiita.com/javacommons/items/9cdd4fdbf6e74c7f106b

def check_brackets1(s):
    dc = dict(zip('{}()[]','}{)(]['))
    lst = []
    for c in s:
        if lst and c == dc[lst[-1]]:
            del lst[-1]
        else:
            lst.append(c)
    return not lst
def check_brackets2(s):
    import re
    ptn = re.compile(r'({}|\(\)|\[\])')
    pre = ''
    while pre != s:
        pre = s
        s = ptn.sub('', s)
    return not s
lst = '(){}[] ([{}]) (} [(]) ([{}()]) [({})](]'.split()
for s in lst:
    print(s, check_brackets1(s), check_brackets2(s))

igraphのインストールを試行錯誤したので書いておく。

brew install igraph pkg-config cairo
pip3 install python-igraph pycairo
vi /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/igraph/drawing/__init__.py で354行目のencodeをdecodeに