Pythonと!

プログラミングド素人の勉強日記です。

pandasのextractallで取得した結果を横持ちのデータに変える

普通にextractallすると、このようなデータフレームを取得することになります。

0
match
0 0 キーワード1
1 キーワード2
1 0 キーワード3
1 キーワード4
2 キーワード5

ただ、このままでは使いづらいので、こういう形式に変更したいときのコードです。

match 0 1 2
0 キーワード1 キーワード2 NaN
1 キーワード3 キーワード4 キーワード5
  • コード
dff = df['hoge'].str.extractall(r'fuga')

dff = dff.unstack()
# NaNを置き換えたいなら、fillnaを追加
# dff = dff.unstack().fillna('なし')

dff.columns = dff.columns.droplevel()

# さらに列名をつけたいなら、
dff.set_axis(['列名0', '列名1', '列名2'], axis='columns')
  • (おまけ)抽出元のdfと結合したいとき
df = pd.concat([df, dff], axis='columns')

ValueError: Cannot mask with non-boolean array containing NA / NaN values

df = df[df[‘hoge’].str.contains(‘fuga’)]

ここで以下のエラーが出ました。どうやらhoge列にNaNが含まれていることが原因みたいです。
ValueError: Cannot mask with non-boolean array containing NA / NaN values

  • 対処法

na=Falseを付ければOK

df = df[df[‘hoge’].str.contains(‘fuga’, na=False)]

dash_tableでハイパーリンクを付ける方法

Dash v1.8.0で実装されたMarkdownによって、dash_table内でハイパーリンクを使うことができるようになりました。
📣 Dash v1.8.0 release - dcc.Graph updates, markdown & link support in DataTable, and more - Dash Python - Plotly Community Forum

  • 実装
import dash
from dash import html
from dash import dash_table
import pandas as pd


df = pd.DataFrame(['パンダ', 'ペンギン', 'ネコ'], columns=['検索データ'])

# ハイパーリンク列の追加
# Markdownのハイパーリンク記法 [表示したいテキスト](URL)の形にする。
df['Google検索'] = '[検索](https://www.google.com/search?q=' + df['検索データ'] + ')'

app = dash.Dash(__name__)

app.layout = html.Div(
    [
        dash_table.DataTable(
            columns=[
                {
                    'name': 'Google検索',
                    'id': 'Google検索',
                    'type': 'text',
                    'presentation': 'markdown' # presentationをmarkdownにする
                }
            ],
            data=df.to_dict('records')
        )
    ]
)

if __name__ == '__main__':
    app.run_server(debug=True)

PowerQueryで別の行の数値を参照したカスタム列を作成したいとき

今回はExcelですが、忘れそうなので自分用のメモを兼ねて。

例えば、こういうテーブルから、

インデックス hoge
0 100
1 200
2 300

hoge列のひとつ上のセルを参照したfuga列を新たに作りたい場合の話。

インデックス hoge fuga
0 100 0
1 200 100
2 300 200
  • 解法
# カスタム列(fuga)として作成
'''
インデックス列は「列の追加タブ > 全般」の「インデックス列」で追加する
また、-1の部分を変えることで、自由に他の行を参照することができる
'''
前のステップ名{[インデックス列] - 1}[hoge列]

# 上記だと1行目が参照するものがなくてエラーを吐くので、IF文でエラー処理
if [インデックス] = 0 then 0 else 前のステップ名{[インデックス列] - 1}[hoge列]

Google ColaboratoryでGiNZAを使ってみる

これだけでOK

# GiNZAインストール
!pip install -U ginza ja-ginza

import pkg_resources, imp
imp.reload(pkg_resources)

# 形態素解析
import spacy

nlp = spacy.load('ja_ginza')
doc = nlp('今年の干支は庚子です。東京オリンピックたのしみだなあ。')

for sent in doc.sents: # 文を区切る
    for token in sent: # 単語を区切る
        print(token.i, token.orth_, token.lemma_, token.pos_, 
              token.tag_, token.dep_, token.head.i)

'''
Output
0 今年 今年 NOUN 名詞-普通名詞-副詞可能 nmod 2
1 の の ADP 助詞-格助詞 case 0
2 干支 干支 NOUN 名詞-普通名詞-一般 nsubj 4
3 は は ADP 助詞-係助詞 case 2
4 庚子 庚子 PROPN 名詞-普通名詞-一般 ROOT 4
5 です です AUX 助動詞 cop 4
6 。 。 PUNCT 補助記号-句点 punct 4
7 東京 東京 PROPN 名詞-固有名詞-地名-一般 compound 8
8 オリンピック オリンピック NOUN 名詞-普通名詞-一般 obl 9
9 たのしみ たのしみ PROPN 名詞-普通名詞-一般 ROOT 9
10 だ だ AUX 助動詞 cop 9
11 なあ なあ PART 助詞-終助詞 mark 9
12 。 。 PUNCT 補助記号-句点 punct 9
'''