2016-11-22 6 views
0

Hier ist meine Datenrahmen:Pandas - Gruppe und verwandeln mit mehreren Argumenten

import pandas as pd 
df = pd.DataFrame({'A': ['one', 'one', 'two', 'two', 'one'], 
        'B': ['Ar', 'Br', 'Cr', 'Ar', 'Ar'], 
        'C': ['12/15/2011', '11/11/2001', '08/30/2015', '07/3/1999', '03/03/2000'], 
        'D': [1, 7, 3, 4, 5], 
        'F': ['12/1/2011','10/1/2000','8/15/2015','12/1/2011','12/1/2011'] }) 
df['C'] = pd.to_datetime(df['C']) 
df['F'] = pd.to_datetime(df['F']) 

Ich möchte B durch Spalte zu gruppieren und dann für jede Gruppe zu überprüfen, ob Spalte C Datum enthält innerhalb von 30 Tagen nach der Spalte F. Ich würde eine Anzeigesäule für die ganze Gruppe wieder, die wie

df['indicator'] = [1,0,1,1,1] 

hier aussehen sollte ist, was ich versucht:

def date_test(x, y): 

    result = False 
    for i in x.index: 
     if x[i]<y[i]+ pd.Timedelta(days=30): 
      result = True 

    return result 

df['indicator'] = df.groupby('B')['C','F'].transform(date_test).astype('int64') 

Aber ich habe zurück TypeError: Transform function invalid for data types

Also ich denke, ich kann es nicht Übergeben Sie zwei Spalten, um die Funktion zu transformieren. Irgendwelche Gedanken?

Antwort

2

Ich denke, Sie haben Recht, der Weg .transform() funktioniert ist, dass die Funktion übergeben bewertet jede Spalte (C und F in diesem Fall) separat. Weitere Informationen finden Sie unter here.

Aber ich denke, Sie .apply verwenden können() und erhalten die gewünschten Ergebnisse:

>>> dfGroup = df.groupby('B') 
>>> dfGroup.apply(lambda x: x['C'] < x['F'] + pd.Timedelta(days=30)) 
>>> B  
    Ar 0  True 
     3  True 
     4  True 
    Br 1 False 
    Cr 2  True 
    dtype: bool 
+1

zu lesen und zuzuweisen: 'df ['indicator'] = df.groupby ('B'). apply (date_test) .swaplevel(). reset_index (-1, drop = True) ' – Boud

+0

@Boud danke um einen Kommentar hinzuzufügen. Es scheint, dass das Folgende auch funktioniert: df ['indicator'] = df.groupby ('B'). Apply (date_test) .reset_index (0, drop = True) 'oder fehlt mir etwas – user1700890

1

Ich weiß nicht, ob es Ihnen helfen wird, aber so etwas wie:

df = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four', 'indicator':[]} 

if 'one' in df.values() == True: 
    df['indicator'].append(1) 
else: 
    df['indicator'].append(0) 

und dann führe es in einer for-Schleife aus, um alle Elemente in deinem 'C'

Verwandte Themen