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

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

ただいまの
回答率

91.23%

  • Python

    4243questions

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

  • Python 3.x

    2792questions

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

  • PyCharm

    58questions

    エディター・開発ツール

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 114

HearthXml

score 20

csvファイル

ゴリラ,パンダ,ニワトリ
インコ,サル,カワウソ
キリン,ワニ,ゾウ
import pandas

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


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

追記

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

  • データフレームの中から、検索キーワード "A" を含む値を持つ行(row) を抽出する 
from io import StringIO
import pandas as pd
import numpy as np

TESTDATA = StringIO("""col1,col2,col3
BA,B,C
B,B,C
C,C,AB""")

df = pd.read_csv(TESTDATA)
print(df)

df2 = df.applymap(lambda x:True if 'A' in x else np.nan)
df2 = df2.dropna(axis=0, how='all')

df = df[df.index.isin(df2.index)]
df = df.reset_index(drop=True)

print(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/13 08: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 × × 〇

    キャンセル

  • 2017/12/13 08:53

    上記の例が期待する結果でしょうか? 上記のようにカラムの値が検索ワードに部分一致する行を抜き出したいなら、

    df.applymap(lambda x:True if x in 'AAB' else np.nan)

    とすれば良さそうな気がします。諸々前提条件と期待する抽出内容を質問に書くと回答がつきやすいと思います。

    キャンセル

  • 2017/12/14 00:34

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

    キャンセル

+1

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


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

from io import StringIO
import pandas as pd
import numpy as np

TESTDATA = StringIO("""col1,col2,col3
BA,B,C
B,B,C
C,C,AB""")

df = pd.read_csv(TESTDATA)
print(df)


mask = df.applymap(lambda x:True if 'A' in x else False).values

new_df = df[mask].reset_index(drop=True)


print(new_df)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/15 02:15

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

    キャンセル

+1

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

この方法を使うと

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

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

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

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

import pandas as pd
import numpy as np

df = pd.DataFrame([['aAAa', 'AAa', ''],[99, 'aAa', np.nan]])

ret = df.apply(lambda d: d.str.contains('AA'))
print(ret)
#       0      1      2
# 0  True   True  False
# 1   NaN  False    NaN

# 引数に を na=False を渡すと NaN 部を Falseにできる
ret = df.apply(lambda d: d.str.contains('AA', na=False))
print(ret)
#        0      1      2
# 0   True   True  False
# 1  False  False  False

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.23%

関連した質問

同じタグがついた質問を見る

  • Python

    4243questions

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

  • Python 3.x

    2792questions

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

  • PyCharm

    58questions

    エディター・開発ツール