上流SEが久しぶりに開発してみる日記

マネジメント専任システムエンジニアがなれないプログラミングをしてみる日記です。

python データフレームの特定のカラムに特定の文字列リストが含まれるものを抽出する(部分一致、リスト検索)

ぜったいにもっと簡単にやり方とか関数があると確信していますが、

なかなか見つからなかったのでメモ。

 

 

データフレームの特定のカラムを一定の条件で検索したい。

 

その条件とは特定の文字列のリストがあって、それがふくまれるものを抽出するというもの。

 

ポイントは完全一致でなく、部分一致であること。

検索したい文字列が一つではなく複数あること。

 

 

こんな感じです。

 

■コード

import pandas as pd
import numpy as np


data = ["A1","B2","C3","C1"]
df = pd.DataFrame(data=data, columns=['label'])

#1と3を含むデータを抜きたい
#containsはlistを指定できない。
#isinは完全一致しかできない。。
#というわけで、こんなめんどくさいことをやる。。。

#検索したい文字列のリスト
stringlist = ["1","3"]

indexlist = []

#検索したい文字列を1件ずつループ。含まれていた場合のインデックスをリストに追加していく。
for i in range(len(stringlist)):
    indexlist.extend(df.index[df['label'].str.contains(stringlist[i])].tolist())

#出力したリストをそのまま使うと重複あるので、重複排除して、ソート。
#unique使うと勝手にソートされてしまうが、今回は好都合。
label_list = np.unique(indexlist).tolist()

print("対象を含むデータの抽出")
print(df.reindex(index=label_list))

print("対象を含まないデータの抽出")
print(df.drop(index=label_list))

 

 

■出力結果

対象を含むデータの抽出
  label
0    A1
2    C3
3    C1
対象を含まないデータの抽出
  label
1    B2

1画面に複数formで上手くいかない

久しぶりにプログラミングして、躓いたので更新します。

 

1画面に複数formを設けて、選択したformを送信する画面を作ろうとしました。

 

イメージは以下の通り。

 

<form>

<input value="a">

<input type="submit">

 

<form>

<input value="b">

<input type="submit">

 

<form>

<input value="c">

<input type="submit">

 

bや、cのformを押しても、aがpostされてしまう現象にはまりました。

 

結果的には</form>を忘れていました。。。

 

正しくは以下ですね。。。

 

<form>

<input value="a">

<input type="submit">

</form>

 

<form>

<input value="b">

<input type="submit">

</form>

 

<form>

<input value="c">

<input type="submit">

</form>

 

 

htmlは苦手なので、構文ミスが結構多い。。。

<python>jupyter notebookでグラフに日本語タイトルを付ける

jypyter notebookでグラフを出力する際に使うライブラリが、Matplotlib。

 

とても便利なのですが、タイトル等に日本語を使う際にフォントの登録が必要となります。

 

詳細なやり方はググってほしいのですが、~.ttcとつくフォントをインストールして、Matplotlibのフォルダに格納してパス指定するやり方が散見されます。

 

 

このやり方でやって私が躓いたのは、

 

 

一回PCを再起動すること。

 

 

これでうまくいきました。

 

再起動って大事ですね。

Cloud Functionsのテスト方法

Cloud Functionsに関数を登録した後にテストをしたくて、用意されているテスト機能を使いたいときに困ったのでメモ。

 

pub/subの設定でテストをしようとすると、単純にインプットにしようとしているjsonをインプットすると、dataというキーが見つからなくてエラーがおきます。

 

{"data":{インプットにしたいjsonデータ}}

 

こんな感じでインプットするとbase64じゃないと怒られる。

 

{"data":"インプットにしたいjsonデータをbase64エンコードした文字列"}

 

これで問題なくテストできましたー。

jqueryを使ってみようとしたがmix contentエラー

jqueryを使って、自分のサイトにグロナビメニューを作ろうと思ったのですが、

 

読み込みエラー。。

 

javascriptの読み込みのURLがhttpsであるべきところが、httpになっていた。。

 

過去のサイトを見るとhttpでもうまくいっていたらしい。

 

 

まあ、こういうこともある。

GO言語でGAE上にグラフ表示その2

前回頑張って画像出力してhtmlに埋め込もうとしましたが、動的コンテンツは制御が難しい。

 

ふと、ていうか、javascriptでいいのでは?と思い調べるといくらでもライブラリが出てくる。

 

Google chartを選択したら瞬殺で、

グラフ表示ができました。

 

いやーなんていう遠回り。。

 

 

GO言語でGAEでグラフを作りたい!

GAE上にGO言語でWEBアプリケーションを作っています。

 

で、あるデータをもってきてグラフを生成したいなと思っています。

 

まずは画像ファイルを出力してそれを画面に表示する方式でいこうと思っています。

 

ライブラリはgonum.org/v1/plotを使用しようと考えました。

 

ローカルでは動くのに、GAE上ではどうしてもデプロイエラーとなる。

 

■エラー

../../google.go.gomod/gopath/pkg/mod/gonum.org/v1/plot@v0.10.0/vg/vgpdf/vgpdf.go:12:2: package embed is not in GOROOT

 

なんか、パッケージの中でパッケージが見つかっていないっぽい。

 

パッケージの中のソース見たら、確かに明らかにおかしい。

 

現時点でv0.10.0だったので怪しいなとおもい、

V0.9.0のバージョン下げてやったらうまくいきました!

 

何事も最新のものがいいってわけではないですね。