DataFrame」カテゴリーアーカイブ

データフレーム 特定の列が特定の値の行を取得する方法

教員名簿がエクセルであったとして、それをデータフレームとして読み込み、役職が教授の行の氏名の列の情報だけを取得する方法。df.loc[行][列]という形で中に条件を埋め込んで書けます。

xls= pd.ExcelFile(file)
df= pd.read_excel(xls)

#教授だけを表示
print (df.loc[(df['役職名(職種名)'] =='教授')]['氏名'])

 

Python DataFrameでixを使おうとするとエラーになる件

Python pandas DataFrameを使っていて、セルを指定する方法がわからずネットで拾ったサンプルコードを使おうとすると、AttributeError: ‘DataFrame’オブジェクトには属性 ‘ix’がありませんというエラーを食らいました。

ixを使ったサンプルコードを頻繁に見かけるのですが、どうやらこれは廃止されたようです。 pandasのバージョンを気にする必要がありそう。ixとかlocとかilocとかで頭が混乱していたのですが、わかりやすい説明がありました。

  1. pandas の loc、iloc、ix の違い – python(コード7区)

DataFrameの行・列を指定する方法として、

行ラベル、列ラベルを使った指定方法⇒ loc

行の番号や列の番号を使った指定方法⇒iloc

ラベルや番号を使った指定方法⇒ix

ということだそうです。そして、pandas バージョン0.20.1 では、.ixインデクサが deprecatedになったそう。

  1. Pandas メジャーアップデート(0.20.1)の要点〜高速 I/O、集約関数強化など(2017-05-11 luggage baggage)
  2. Starting in 0.20.0, the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers. (pandas.pydata.org)

データフレームの中から特定の文字を含む行を抽出する

データフレームの中から特定の文字を含む行を抽出する

# 特定の名前を探す練習スクリプト
import pandas as pd

df=pd.DataFrame({'名前':['太郎','次郎','三郎'],'研究種目':['若手研究','基盤研究(C)','若手研究']
                 ,'総額':[360,350,480]})

print(df,'\n')

mask = df.applymap(lambda x: '三郎' in str(x))

print (mask)

df1 = df[mask.any(axis=1)]

print('\n', df1)

上のコードを実行した結果は、以下のようになります。

   名前     研究種目   総額
0  太郎     若手研究  360
1  次郎  基盤研究(C)  350
2  三郎     若手研究  480 

      名前   研究種目     総額
0  False  False  False
1  False  False  False
2   True  False  False

    名前  研究種目   総額
2  三郎  若手研究  480

pythonでのエラー ValueError: Cannot mask with non-boolean array containing NA / NaN valuesへの対処法【解決】

pythonのpandasのデータフレームの特定のカラムの中である文字列を含むものだけ取り出したいと思いました。

df_文字列= df[df[‘特定のカラム名’].str.contains(‘文字列’)]

というコードを実行したところ、

ValueError: Cannot mask with non-boolean array containing NA / NaN values

というエラーになりました。このエラーの原因は何かというと、カラムの中に「空欄」が存在していたからなんですね。

以下のようにNAを無視するように na=Falseを付け加えたら、

df_文字列 = df[df[‘特定のカラム名’].str.contains(‘文字列’, na=False)]

エラーを回避できました。

この手のエラーは、空欄を含むスプレッドシートをデータフレームとして読み込んで何か処理をしようとするときには必ず遭遇してしまうと思います。空欄に関しては、何らかの例外処理が必要ということですね。