🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

591閲覧

Python pandas使って、特定条件にマッチした行を除外したリストをアウトプットしたい。

usaginote1020

総合スコア8

Python 3.x

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

0グッド

0クリップ

投稿2021/02/04 14:25

前提・実現したいこと

Python pandas使って、10万行×10列あるデータを特定条件にマッチしたものを除外したリストをアウトプットする。

|No|Name|Sex|Birth|age|From|blood
|:--|:--:|--:|
1|Suzuki|Female|19950224|25|Osaka|A
2|TakemotoHina|Female|19991111|53|Osaka|A
3|Suzuki|Male|19991111|36|Tokyo|B
4|HanadaTamami|Female|19650503|55|Osaka|B
5|Suzuki|Male|19690919|51|Tokyo|O
6|FukayaYoshio|Male|19970430|23|Tokyo|O
7|TejimaYoshiko|Female|19810418|99|Osaka|O
8|Suzuki|Female|19920913|28|Kyoto|AB
9|Suzuki|Male|19720803|87|Kyoto|AB
10|KamiyamaTetsuko|Female|19890731|91|Saitama|O

https://hogehoge.tk/personal/generator/ にてランダム生成したものを少し修正

###条件
以下の条件に合致したものはリストから除外する
条件1 Name=Suzuki &Sex=Female &From=Osaka
条件2 Birth=19991111 &blood=A
条件3 From=Osaka,age>70

条件1でNo.1を除外
条件2でNo.2を除外
条件3でNo.7を除外

最終的に
No.3,4,5,6,8,9,10を出力したい

該当のソースコード

各条件ごとにステップに分けて徐々にリストを小さくしていければと思っています

df_1 = df[~(df['Name']=='Suzuki') and (df['Sex']=='Female') and (df['From']=='Osaka')] df_2 = df_1[~(df_1['Birth']=='19991111') and (df_1['blood']=='A')] df_3 = df_2[~(df_2['From']=='Osaka') and (df_2['age']>70)]

素人でうまく書けませんが、上記ような形で、、、

補足情報(FW/ツールのバージョンなど)

python 3.9.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

件数が10万行とのことですので、メモリ使用量、性能を考えると、applyを使うことをお勧めします。

python

1import pandas as pd 2import io 3 4def condition(row): 5 c1 = row['Name']=='Suzuki' and row['Sex']=='Female' and row['From']=='Osaka' 6 c2 = row['Birth']==19991111 and row['blood']=='A' 7 c3 = row['From']=='Osaka' and row['age']>70 8 return not(c1 or c2 or c3) 9 10indata = '''No\tName\tSex\tBirth\tage\tFrom\tblood 111\tSuzuki\tFemale\t19950224\t25\tOsaka\tA 122\tTakemotoHina\tFemale\t19991111\t53\tOsaka\tA 133\tSuzuki\tMale\t19991111\t36\tTokyo\tB 144\tHanadaTamami\tFemale\t19650503\t55\tOsaka\tB 155\tSuzuki\tMale\t19690919\t51\tTokyo\tO 166\tFukayaYoshio\tMale\t19970430\t23\tTokyo\tO 177\tTejimaYoshiko\tFemale\t19810418\t99\tOsaka\tO 188\tSuzuki\tFemale\t19920913\t28\tKyoto\tAB 199\tSuzuki\tMale\t19720803\t87\tKyoto\tAB 2010\tKamiyamaTetsuko\tFemale\t19890731\t91\tSaitama\tO 21''' 22with io.StringIO(indata) as f: 23 df = pd.read_csv(f, sep='\t', engine='python', parse_dates=[0]) 24 25print(df) 26 27df_output = df[df.apply(condition, axis=1)] 28 29print(df_output)

print(df)以降の実行結果は以下です。

python

1>>> print(df) 2 No Name Sex Birth age From blood 30 1 Suzuki Female 19950224 25 Osaka A 41 2 TakemotoHina Female 19991111 53 Osaka A 52 3 Suzuki Male 19991111 36 Tokyo B 63 4 HanadaTamami Female 19650503 55 Osaka B 74 5 Suzuki Male 19690919 51 Tokyo O 85 6 FukayaYoshio Male 19970430 23 Tokyo O 96 7 TejimaYoshiko Female 19810418 99 Osaka O 107 8 Suzuki Female 19920913 28 Kyoto AB 118 9 Suzuki Male 19720803 87 Kyoto AB 129 10 KamiyamaTetsuko Female 19890731 91 Saitama O 13>>> 14>>> df_output = df[df.apply(condition, axis=1)] 15>>> 16>>> print(df_output) 17 No Name Sex Birth age From blood 182 3 Suzuki Male 19991111 36 Tokyo B 193 4 HanadaTamami Female 19650503 55 Osaka B 204 5 Suzuki Male 19690919 51 Tokyo O 215 6 FukayaYoshio Male 19970430 23 Tokyo O 227 8 Suzuki Female 19920913 28 Kyoto AB 238 9 Suzuki Male 19720803 87 Kyoto AB 249 10 KamiyamaTetsuko Female 19890731 91 Saitama O

投稿2021/02/04 16:12

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問