web-dev-qa-db-ja.com

複数の列でpandasデータフレームをどのようにフィルタリングしますか

単一の列でデータフレーム(df)をフィルタリングするには、男性と女性のデータを考慮する場合、次のようにします。

males = df[df[Gender]=='Male']

質問1-しかし、データが複数年にわたっており、2014年の男性のみを見たい場合はどうなりますか?

他の言語では、次のようなことをします。

if A = "Male" and if B = "2014" then 

(これを行い、新しいデータフレームオブジェクトで元のデータフレームのサブセットを取得する場合を除く)

質問2.ループでこれを行い、年と性別の一意のセットごとにデータフレームオブジェクトを作成する方法(つまり、2013-Male、2013-Female、2014-Male、および2014-Femaleのdf)

for y in year:

for g in gender:

df = .....
71
yoshiserry

&演算子を使用して、サブステートメントを()で囲むことを忘れないでください:

males = df[(df[Gender]=='Male') & (df[Year]==2014)]

Forループを使用してdictにデータフレームを保存するには:

from collections import defaultdict
dic={}
for g in ['male', 'female']:
  dic[g]=defaultdict(dict)
  for y in [2013, 2014]:
    dic[g][y]=df[(df[Gender]==g) & (df[Year]==y)] #store the DataFrames to a dict of dict

編集:

getDFのデモ:

def getDF(dic, gender, year):
  return dic[gender][year]

print genDF(dic, 'male', 2014)
119
zhangxaochen

フィルタとして使用し、複数の列に依存するより一般的なブール関数の場合、次を使用できます。

df = df[df[['col_1','col_2']].apply(lambda x: f(*x), axis=1)]

ここで、fは、col_1とcol_2の要素(x1、x2)のすべてのペアに適用される関数で、必要な条件(x1、x2)に応じてTrueまたはFalseを返します。

20
guibor

pandas 0.1 から開始します。これが最も効率的な方法です。

df.query('Gender=="Male" & Year=="2014" ')
2
redreamality