2017-05-12 2 views
0

Ich habe im Grunde einen Datensatz von 3 Spalten.Python und Pandas: Holen Sie sich die Anzahl der Personen in einer Spalte, nach einem Datum

Restaurant | Customer | Date 

Es gibt mehrere Restaurants, Kunden und Termine. Mit python/pandas versuche ich die Anzahl der Kunden zu finden, die mindestens 3 oder mehr Besuche in einem einzigen Restaurant haben und separat 3 oder mehr Besuche in einem der Restaurants. (Beispiel: 1 Person besuchte 3 verschiedene Restaurants)

Ich würde auch gerne die Anzahl der einzigartigen Geräte sehen, die ein Restaurant 3 oder öfter besucht haben.

Bisher habe ich:

df.groupby(['Restaurant','name'])['date'].value_counts() 

, die mir die Anzahl der Zeiten nach Datum besucht gibt, aber ich möchte die tatsächliche Anzahl der besuchten Termine. (Eindeutige Daten)

Danke für jede Hilfe! Ich hoffe, ich war klar genug.

Antwort

2

Setup Berry py der Verwendung:

df = pd.DataFrame({'restaurant':['Freddys', 'Freddys', 'Jumpin Java', 'Freddys', 'Jumpin Java', 'Caffe Low', 'Kitchen 2'], 
        'customer': ['John', 'John', 'Paula', 'John', 'Justin', 'Paula', 'Paula'], 
        'date':['1-1-17', '1-2-17', '1-3-17', '1-4-17', '1-5-17', '1-6-17', '1-7-17']}) 

df_out = df.groupby('customer').agg({'customer':'size','restaurant':'nunique'}).rename(columns={'customer':'Num_Visits','restaurant':"Num_Restaurants"}) 

df_out.query('Num_Visits >= 3') 

Ausgang:

  Num_Visits Num_Restaurants 
customer        
John    3    1 
Paula    3    3 
+0

Das hat mich auf dem richtigen Weg! Danke @berrypy und ScottBoston, das folgende funktionierte für meine Situation 'df_out = df.groupby ('Kunde'). Agg ({'Kunde': 'Größe', 'Datum': 'Nunique'}). Umbenennen (Spalten = { "Kunde": "Num_Visits", "Datum": "Num_Dates"}) ' – warvolin

0

Richten Sie das Datenszenario ein, das Ihrer Erklärung entspricht.

>>> df = pd.DataFrame({'restaurant':['Freddys', 'Freddys', 'Jumpin Java', 'Freddys', 'Jumpin Java', 'Caffe Low', 'Kitchen 2'], 
        'customer': ['John', 'John', 'Paula', 'John', 'Justin', 'Paula', 'Paula'], 
        'date':['1-1-17', '1-2-17', '1-3-17', '1-4-17', '1-5-17', '1-6-17', '1-7-17']}) 

    customer date restaurant 
0  John 1-1-17  Freddys 
1  John 1-2-17  Freddys 
2 Paula 1-3-17 Jumpin Java 
3  John 1-4-17  Freddys 
4 Justin 1-5-17 Jumpin Java 
5 Paula 1-6-17 Caffe Low 
6 Paula 1-7-17 Kitchen 2 

Erstellen Sie eine Funktion, um die von Ihnen angegebenen Bedingungen zurückzugeben.

def get_eating_pattern(df): 
    for name in df.customer.unique(): 
     three_visits = 0 
     total_visits = 0 
     unique_rests = 0 

     three_visits = df.loc[df['customer'] == name]['restaurant'].value_counts()[0] 
     if '3' in str(three_visits): 
      print(name, 'went to the same restaurant 3 times.') 

     total_visits = df.loc[df['customer'] == name]['restaurant'].value_counts().sum() 
     unique_rests = df.loc[df['customer'] == name]['restaurant'].nunique() 

     if total_visits == 3 & unique_rests == 3: 
      print(name, 'went to 3 different restaurants.') 

Testfunktion, um sicherzustellen, dass es passt, was erwartet man auf den Inhalt von df basiert.

>>> get_eating_pattern(df=df) 
John went to the same restaurant 3 times. 
Paula went to 3 different restaurants. 
Verwandte Themen