web-dev-qa-db-de.com

Wie filtert man pandas dataframes nach mehreren Spalten?

Wenn Sie einen Datenrahmen (df) nach einer einzelnen Spalte filtern möchten, können Sie Folgendes tun:

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

Frage 1 - Was aber, wenn die Daten mehrere Jahre umfassten und ich nur Männer für 2014 sehen wollte?

In anderen Sprachen könnte ich etwas machen wie:

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

(außer ich möchte dies tun und eine Teilmenge des ursprünglichen Datenrahmens in einem neuen Datenrahmenobjekt erhalten)

Frage 2: Wie mache ich das in einer Schleife und erstelle ein Datenrahmenobjekt für jeden eindeutigen Satz von Jahr und Geschlecht (d. H. Ein DF für: 2013-männlich, 2013-weiblich, 2014-männlich und 2014-weiblich)

for y in year:

for g in gender:

df = .....
71
yoshiserry

Mit & Operator, vergessen Sie nicht, die Unteranweisungen mit ():

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

So speichern Sie Ihre Datenrahmen in einer dict mit einer for-Schleife:

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

BEARBEITEN:

Eine Demo für Ihr getDF:

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

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

Für allgemeinere boolesche Funktionen, die Sie als Filter verwenden möchten und die von mehr als einer Spalte abhängen, können Sie Folgendes verwenden:

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

dabei ist f eine Funktion, die auf jedes Elementpaar (x1, x2) aus Spalte_1 und Spalte_2 angewendet wird und je nach gewünschter Bedingung (x1, x2) Wahr oder Falsch zurückgibt.

20
guibor

Beginnen Sie mit pandas 0.1 , dies ist der effizienteste Weg.

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