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

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

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

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

303閲覧

データフレーム(df)の中のseriesのテキストデータについて、設定したワードリスト(list)のテキストデータに基づいて部分一致で新しいデータセットをエクセルで抽出したい。

mi2

総合スコア63

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/03/25 01:14

前提・実現したいこと

データフレーム(df)の中のseriesのテキストデータについて、設定したワードリスト(list)のテキストデータに基づいて部分一致で新しいデータセットをエクセルで抽出したい。

エクセルシートから読み込んだテキストデータについて、ワードリストが含まれていたら抽出せず(行ごと削除するイメージ)、ワードリスト以外の一覧を最終的にはエクセルで吐き出したいと思っております。

テキストデータは20万行近くあり、ワードリストは数百行、どちらも半角、全角、記号等が入り混じっている状況です。

調べながら色々と試してみたのですが、想定する挙動にならず、よく分からなくなってきてしまったため質問させて頂きます。

発生している問題・エラーメッセージ・該当のソースコード

1 こちらは想定する件数がうまく取れません。(取得件数が少ない) df = df[~reduce(lambda a, b: a&b, (df['word'].str.contains(s) for s in wordlist))] 2 こちらは2行目が動きません。 mask = df['Message'].str.contains(r'\b(?:{})\b'.format('|'.join(wordlist))) data = df[~mask] TypeError: bad operand type for unary ~: 'float'

dfとワードリストの設定

dfでデータセットを読み込んでdf['word']のシリーズが対象、ワードリストについてはlistにしています。
///df
df = pd.read_excel('word.xlsx', header=0, encoding='utf-8_sig')
///
wordlist = pd.read_excel('wordlist.xlsx', header=0, encoding='utf-8_sig')
wordlist = np.ravel(wordlist).tolist()

環境

python3.6.5
(anacondaにて構築)

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

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

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

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

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

guest

回答1

0

ベストアンサー

単に

Python

1df[~df['word'].str.contains('|'.join(wordlist))]

で駄目ですか?

wordlistの文字に正規表現で使用される特殊文字('$'や'^')が含まれるる場合は動作しません。

【追記】
上記の問題(メタ文字を含んだ場合の対応)を考えると、wordlist は予め エスケープしておいたほうが安全かもしれません

Python

1import re 2 3escaped_wordlist = [re.escape(w) for w in wordlist] 4df[~df['word'].str.contains('|'.join(escaped_wordlist))]

投稿2019/03/25 02:07

編集2019/03/25 02:29
magichan

総合スコア15898

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

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

mi2

2019/03/25 02:26

ご回答頂きましてありがとうございます。 思考がやや脱線していたみたいでした。 上記のご回答にcontainsの引数に空欄に対する欠損処理のオプションをつけることで対応できました。 ありがとうございました。
magichan

2019/03/25 02:30

解決してなによりです。 リストにメタ文字を含んでいる場合を想定して、一応補足を追記しておきました。
mi2

2019/03/25 03:25

ご親切にありがとうございます。追記の内容につきましても確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問