2017-08-15 4 views
1

'はリストのようなオブジェクトがISIN()に渡すことが許可されている、あなたは[INT]を渡さただ例示の目的のために使用されます。エラーは、採用のコードに続い

data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
    'year': [2012, 2012, 2013, 2014, 2014], 
    'reports': [4, 24, 31, 2, 3]} 

df = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])

df = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])

value_list = ['Tina', 'Molly', 'Jason']

df[df.name.isin(value_list)] 

ここで、リスト(すなわち、value_list)が渡されたことがわかる。リストを渡したいだけでなく、整数(つまり、レポート列の24行に対応する行を検索する)を渡したい場合は、理想的な方法があります。私はこれを実行しようとしましたが、それは実際に動作しません:

df[df.reports.isin(24)] 

エラーがのように来る:リストだけのようなオブジェクトがISIN()に渡すことが許可されている、あなたは[INT]を通過しました。

また、どのように私は、レポート24に対して対応する '名前' を見つけることができる、(すなわち、モリー)

+0

エラーメッセージはわかりやすいようです。あなたがそれを渡すときにリストに24を入れてください。 '.isin([24])'。しかし、アイテムが1つしかない場合は、おそらく '=='が必要です。 – roganjosh

+0

ありがとう@ roganjosh。 はい、そうです。私は実際にリストを渡すことを望んでいませんでしたが、==は動作します。 – John

答えて

2

ジャストブール - インデックスを使用:あなた単一で.isinを使用することができ

>>> df 
      name reports year 
Cochice  Jason  4 2012 
Pima  Molly  24 2012 
Santa Cruz Tina  31 2013 
Maricopa  Jake  2 2014 
Yuma   Amy  3 2014 
>>> df[df.reports == 24] 
     name reports year 
Pima Molly  24 2012 

を要素リスト:

>>> df[df.reports.isin([24])] 
     name reports year 
Pima Molly  24 2012 

しかし、boolean-indexingオプションは通常表示されるオプションです。

あなたはデータフレーム(10,000行の上に、のは言わせて)、より複雑なブール式を持っている場合、あなたはdf.queryで効率的にこれを行うことができます。

>>> df.query("reports==24 or name == 'Jason'") 
      name reports year 
Cochice Jason  4 2012 
Pima  Molly  24 2012 

そして、これが速くなります使用可能なエンジンがnumexprの場合はメモリ効率が向上します。

+0

ありがとう@ juanpa.arrivillaga ...私は感謝しています。このdf.queryは本当に素晴らしいことです。また、.isinの代わりに==は完璧にうまくいった。 – John

+0

@Johnは小さなデータフレームで 'df.query'を注意して使用しますが、実際にはパフォーマンスを悪化させる可能性があります(* https://pandas.pydata.org/pandas-docs/stable/enhancingperf.html#pandas -eval-performance)を指定します。 –

+0

ありがとうございます...私は慎重になるでしょう:-) – John