pandasのDataFrameの中から論理式を満たすデータを抽出したい。
pandas初心者です。入力の中から、後段の処理をする前に明らかなエラーを抽出してレポートを作りたいと思っています。データ抽出の単純な例
a<b a == c
はNet上で見かけて、うまくいくのですが複数の式の組み合わせ抽出がうまくできていません。
用意したテストデータは以下の通りです
| No.|sei| mei| type| name|
|------|-----|-----|------|
|0| 織田| NaN| 団体| NaN|
|1| NaN| 信長| 団体| Fuga|
|2| 織田| 信長| 団体| Fuga|
|3| 羽柴| NaN| 個人| Dayo|
|4| NaN| 秀吉| 個人| NaN|
この中から
- sei mei いずれかがNaNなもの
- type=="団体" かつname==NaN
を抽出したいと思い、以下のコードを作りました
# -*- coding: utf-8 -*- """ Created on Wed Jun 5 14:31:59 2019 @author: glp """ import numpy as np import pandas as pd df = pd.DataFrame( [['織田', np.nan, '団体', np.nan], [ np.nan, '信長','団体', 'Fuga'], ['織田', '信長','団体', 'Fuga'], ['羽柴', np.nan,'個人', 'Dayo'], [np.nan, '秀吉', '個人', np.nan], ['羽柴', '秀吉', '個人', 'Dayo']], columns = ['sei','mei','type', 'name']) print(df) # sei mei いずれかがNaNの物 err_name = df[ df[ 'name'].isnull() | df[ 'mei'].isnull()] # (1) print(err_name) # type==団体 かつ nameがNaNなもの err_type = df[ df[ 'type']=='団体' & df[ 'name'].isnull() ] # (2) print(err_type)
試してみると条件(1)はうまく抽出できるのですが、(2)は以下のようなエラーになります
Traceback (most recent call last): File "C:\Users\glp\Anaconda3\lib\site-packages\pandas\core\ops.py", line 1789, in na_op result = op(x, y) File "C:\Users\glp\Anaconda3\lib\site-packages\pandas\core\ops.py", line 187, in rand_ return operator.and_(right, left) TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\glp\Anaconda3\lib\site-packages\pandas\core\ops.py", line 1804, in na_op result = libops.scalar_binop(x, y, op) File "pandas/_libs/ops.pyx", line 171, in pandas._libs.ops.scalar_binop ValueError: Does not understand character buffer dtype format string ('?') During handling of the above exception, another exception occurred: Traceback (most recent call last): File "test.py", line 25, in <module> err_type = df[ df[ 'type']=='団体' & df[ 'name'].isnull() ] File "C:\Users\glp\Anaconda3\lib\site-packages\pandas\core\ops.py", line 1850, in wrapper res_values = na_op(self.values, ovalues) File "C:\Users\glp\Anaconda3\lib\site-packages\pandas\core\ops.py", line 1810, in na_op typ=type(y).__name__)) TypeError: cannot compare a dtyped [bool] array with a scalar of type [bool]
forを使い一行づつ判定する方法はうまく動いたのですが、勉強を兼ねてDataFrameからの抽出を
マスターしたいな、と思っています。
どなたかわかる方、教えていただけませんか ?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/07 05:58