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

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

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

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

pandas

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

Q&A

解決済

2回答

603閲覧

pandas 複数列の条件から、行を抽出する

matsutai

総合スコア53

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2022/12/25 00:52

実現したいこと

pandasデータフレームのある範囲の複数列から、listに含まれない文字がある列だけを抽出したいです。
下記のように、query を使ってできるのですが、対象の列数が多くなると全て記載するのが大変なのと、列の数が変わる場合に対応できないので、対象列をスライスにして、抽出したいのです。
いろいろ調べて分かりませんでした。どなたか教えていただけないでしょうか?

該当のソースコード

python

1import pandas as pd 2 3list = ['A','B'] 4df1 = pd.DataFrame([['一郎',1, 'A',2], ['二郎',3, 4,2], ['三郎','A',5,4],['四郎',4,3,'B']], columns=['名前','x', 'y','z']) 5df1 6 7 名前 x y z 80 一郎 1 A 2 91 二郎 3 4 2 102 三郎 A 5 4 113 四郎 4 3 B 12 13x列以降の列に、listに含まれない行を抽出したいです。queryを使うと下のようになるかと思います 14 15df2 = df1.query('x not in @list and y not in @list and z not in @list') 16df2 17 18 名前 x y z 191 二郎 3 4 2 20 21列数が変わる場合などに対応したく、上記の列の指定をスライスで行うようにしたいのですが、良い方法はないのでしょうか? 22 23

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1import pandas as pd 2 3lst = ['A','B'] 4df1 = pd.DataFrame([['一郎',1, 'A',2], ['二郎',3, 4,2], ['三郎','A',5,4],['四郎',4,3,'B']], columns=['名前','x', 'y','z']) 5df2 = df1[~df1.loc[:, 'x':].isin(lst).any(axis=1)] 6print(df2) 7 8# 9# 名前 x y z 10# 1 二郎 3 4 2

投稿2022/12/25 03:09

melian

総合スコア19703

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

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

0

以下のように列を位置で指定するとスライスが使えます。
またand条件はallでもできます。

Python

1import pandas as pd 2 3lst = ['A','B'] 4df1 = pd.DataFrame([['一郎',1, 'A',2], ['二郎',3, 4,2], ['三郎','A',5,4],['四郎',4,3,'B']], columns=['名前','x', 'y','z']) 5 6# 列をインデックスで指定して抽出 7cond = ~df1.iloc[:,1:].isin(lst) 8print(cond) 9""" 10 x y z 110 True False True 121 True True True 132 False True True 143 True True False 15""" 16 17# すべての列が真の行 18cond = cond.all(axis=1) 19print(cond) 20""" 210 False 221 True 232 False 243 False 25""" 26 27df2 = df1[cond] 28print(df2) 29# 名前 x y z 30#1 二郎 3 4 2

投稿2022/12/25 01:27

can110

総合スコア38260

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

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

matsutai

2022/12/25 05:16

ありがとうございます。 段階を踏まえて書いていただいたので、理解が深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問