2016-11-30 5 views
1

mit Python 3-Codierung und Pandas Version 0.18.1Wie Pandas Datenrahmen von Benutzereingaben

Ich versuche, mein Programm dynamischer zu gestalten, indem sie Benutzeroptionen verwenden, um Daten von Datenrahmen zu filtern.

Meine Fragen sind:

1) Wie kann ich meine Benutzerauswahl für die Filterung in Datenrahmen zur Verfügung?

2) Gibt es einen besseren Weg, dies zu tun? Mabye mit Funktion oder Klassen?

Angenommen meine df ist die folgende:

df.dtypes 

PIID object  
fy  object 
zone object 

Wenn fy unterteilt:

df.groupby('fy').PIID.count() 

fy 
2014 38542 
2015 33629 
2016 32789 

Wenn Zone unterteilt:

df.groupby('zone').PIID.count() 

AZW - Acquisition Zone West  3909 
NAZ - Northern Acquisition Zone 1167 
SAZ - Southern Acquisition Zone 2983 

Normalerweise kann ich erstellen Sie einfach einen neuen Datenrahmen mit Filtern, indem Sie Folgendes tun:

year = df['fy'] == '2016'  
zone = df['zone'] == 'AZW - Acquisition Zone West' 

newdf = df[year & zone] 

Aber wie kann ich dies dynamischer machen, indem ich Benutzeroptionen zur Verfügung stelle?

An diesem Punkt gebe ich den Benutzer einige Optionen mit booleans für fy:

print ('What is the interested year?') 
print ('1. 2014') 
print ('2. 2015') 
print ('3. 2016') 

year = input('> ') 

if year == '1': 
    year1 = df['fy'] == '2014' 
elif year == '2': 
    year2 = df['fy'] == '2015' 

Und einige booleans für Zone:

print ('What is the interested zone?') 
print ('1. AZW - Acquisition Zone West') 
print ('2. NAZ - Northern Acquisition Zone') 
print ('3. SAZ - Southern Acquisition Zone') 


zone = input('> ') 

if zone == '1': 
    zone1 = df['zones'] == 'AZW - Acquisition Zone West' 
elif zone == '2': 
    zone2 = df['zones'] == 'Northern Acquisition Zone' 

An dieser Stelle ich weiß nicht, wie das erhalten Benutzerauswahl

newdf = df[choice1 & choice2] 

wo Wahl 1 ist das Jahr und Wahl 2 ist die Zone.

Vielen Dank im Voraus für jede Hilfe!

Antwort

0

Hier ist mein Stich dabei. Sie müssen jedoch Ihre eigenen Fehlermeldungen und Handler für falsche Eingaben erstellen.

import pandas as pd 

df = pd.DataFrame({"PIID":[38542,33629,32789], 
        "fy":["2014","2015","2016"], 
        "zone":["AZW - Acquisition Zone West", "NAZ - Northern Acquisition Zone", "SAZ - Southern Acquisition Zone"]}) 


def get_choice(data, column): 
    """ 
    Gets user choice 
    """ 
    nums = [val for val in range(len(df[column].unique()))] 
    choices = list(zip(nums, df[column].unique())) 
    print("What '%s' would you like?\n" % column) 
    for v in choices: 
     print("%s. %s" % (v)) 
    user_input = input("Answer: ") 
    user_answer = [val[1] for val in choices if val[0]==int(user_input)][0] 
    print("'%s' = %s\n" % (column, user_answer)) # Just tells the user what they answered 
    return user_answer 

def main(): 

    year_input = get_choice(data=df, column="fy") 
    zone_input = get_choice(data=df, column="zone") 
    newdf = df.loc[(df["fy"]==year_input)&(df["zone"]==zone_input)] 
    print(newdf) 

if __name__ == "__main__": 
    main() 

Also, wenn Sie Eingabe etwas wie "0" für die erste Option (Jahr) und "0" für die zweite Option (Zone) sollte die Ausgabe so etwas wie:

PIID fy       zone 
0 38542 2014 AZW - Acquisition Zone West 

Es sollte Skala, aber wie ich schon sagte, müssen Sie natürlich Ihre eigenen benutzerdefinierten Tweaks hinzufügen. Dies sollte ausreichen, um das Problem in Ihrer Frage zu verallgemeinern und zu lösen. Nach dem Lesen des Codes, den Sie haben, empfehle ich Ihnen, das DRY-Prinzip in Ihrer Arbeit zu implementieren (Do not Repeat Yourself (z. B. mit einer Tonne if-Anweisungen)). Hoffe das hilft.

+0

Danke, Ralston! Du hast den Nagel auf den Kopf getroffen. Total gut genug, um es zu verallgemeinern. – david