質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

Q&A

解決済

3回答

2507閲覧

文字列の中にdataframeと部分一致する要素の情報の取得方法を教えてください。

HearthXml

総合スコア51

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2017/12/12 16:36

編集2017/12/13 15:24
csvファイル ゴリラ,パンダ,ニワトリ インコ,サル,カワウソ キリン,ワニ,ゾウ

Python

1import pandas 2 3#実際のcsvファイルには、列名ないのでheader=Noneで自動で列名を付ける設定にしています。 4df = pandas.read_csv("csvファイル",header=None) 5#全ての要素に対してラムダ式を使ってfindで検索かける 6s = df.applymap(lambda x: "検索ワード".find(str(x))) 7#ヒットしない要素には-1が表示されヒットしたものは-1以外の数字が表示される(dataframeの2列目以降をfindしたときの数字の意味がわからない) 8print(s) 9#-1以外の数字が入ってる要素の行列を求める(分からない)

上の要領で検索していけばいいのですが、その―1以外の要素の行列の取得ができません。
もしかしたら
s = df.applymap(lambda x: str(x).find("検索ワード"))
とデータフレームを数字に変えなくても、検索キーワードに一致する要素を見つけれる方法があるかもしれません。

追記

前提条件として、
文字列の長さは
検索ワード>=データフレームの要素
検索ワードは"サル"といった単語のみや
"ワニ クジラ"といった複数単語
"ワニが逃げた"といった短文だったりします。

期待する抽出内容として、
検索ワードは"ワニとサル"とすると、
ワニとサルがある行数と列数を取得する。
または、ヒットした単語の行にある他の要素の単語を取得したいです。
ワニならキリン,ゾウ
サルならインコ,カワウソ

最初の投稿でtsvファイルを扱うと書きましたが、CSVファイルを扱うことが分かったので変更しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

まず、現状は applymap() を使用して、全てのセル値に対して lambdaにて str.find()を実行しているようですが、apply()を使って列毎のデータ(Series)を取り出して、pandas.Series.str (Siriesデータ内の文字列に対するAccessor)を使ったほうが良いかと思います。

この方法を使うと

  • 列毎に処理できるので(たぶん)高速
  • 文字列以外の値を無効(NaN)にしてくれるので、文字列に変換する部分が不要

といったメリットがあります。

また、pandas.Series.str には find()以外に contains() というメソッドがあり、戻り値がBool値なので文字列が含まれているかどうかの判定にはこちらの方が直感的です。

ということで、サンプルです。

Python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame([['aAAa', 'AAa', ''],[99, 'aAa', np.nan]]) 5 6ret = df.apply(lambda d: d.str.contains('AA')) 7print(ret) 8# 0 1 2 9# 0 True True False 10# 1 NaN False NaN 11 12# 引数に を na=False を渡すと NaN 部を Falseにできる 13ret = df.apply(lambda d: d.str.contains('AA', na=False)) 14print(ret) 15# 0 1 2 16# 0 True True False 17# 1 False False False

投稿2017/12/12 23:53

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

もしかして見当違いかもしれませんが、やりたいことはこんな感じでしょうか?

  • データフレームの中から、検索キーワード "A" を含む値を持つ行(row) を抽出する

python

1from io import StringIO 2import pandas as pd 3import numpy as np 4 5TESTDATA = StringIO("""col1,col2,col3 6BA,B,C 7B,B,C 8C,C,AB""") 9 10df = pd.read_csv(TESTDATA) 11print(df) 12 13df2 = df.applymap(lambda x:True if 'A' in x else np.nan) 14df2 = df2.dropna(axis=0, how='all') 15 16df = df[df.index.isin(df2.index)] 17df = df.reset_index(drop=True) 18 19print(df)

実行結果

col1 col2 col3 0 BA B C 1 B B C 2 C C AB ↓ # 文字列 "A" を含む値がある行を絞り込み col1 col2 col3 0 BA B C 1 C C AB

投稿2017/12/12 18:17

tell_k

総合スコア2120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HearthXml

2017/12/12 23:12

文字列の長さは 検索ワード>=データフレームの要素 検索ワードは実際には一つ以上の単語です。 あなたの実行結果に書いてあるデータフレームを使うと AABという検索キーワードでデータフレームのBAとC以外の要素の行数、列数を取得する。 col1 col2 col3 0 BA B C 1 B B C 2 C C AB ↓ # 文字列 "AAB" に部分一致する要素 col1 col2 col3 0 × 〇 × 1 〇 〇 × 2 × × 〇
tell_k

2017/12/12 23:53

上記の例が期待する結果でしょうか? 上記のようにカラムの値が検索ワードに部分一致する行を抜き出したいなら、 df.applymap(lambda x:True if x in 'AAB' else np.nan) とすれば良さそうな気がします。諸々前提条件と期待する抽出内容を質問に書くと回答がつきやすいと思います。
HearthXml

2017/12/13 15:34

欲しい行を取得できました。 そして、質問の仕方で助言をして頂きありがとうございます。
guest

0

tsvファイルの読み込みがよろしくないのではないでしょうか。
http://www.mwsoft.jp/programming/numpy/pandas_csv.html


追記:
見当はずれの指摘で申し訳ありません。
お詫びにベストアンサーのちょっとダイエットした版を添えておきます。

python

1from io import StringIO 2import pandas as pd 3import numpy as np 4 5TESTDATA = StringIO("""col1,col2,col3 6BA,B,C 7B,B,C 8C,C,AB""") 9 10df = pd.read_csv(TESTDATA) 11print(df) 12 13 14mask = df.applymap(lambda x:True if 'A' in x else False).values 15 16new_df = df[mask].reset_index(drop=True) 17 18 19print(new_df)

投稿2017/12/12 17:39

編集2017/12/13 15:49
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HearthXml

2017/12/14 17:15

親切にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問