2017-06-27 5 views
1

Ich habe folgende Datenrahmen, die etwa 4000 Tickers hat und in insgesamt etwa 2 Millionen Zeilen:Pandas: GROUPBY Fillna Problem

Ticker  Date    Rank   
    1   01/01/2000   5    
    1   01/02/2000  NaN    
    2   01/01/2000   4    
    2   01/02/2000   2    

ich jetzt den folgenden Code Vortrages den Rang Säule laufen gelassen, die vollständig funktioniert Fine .:

import pandas as pd 
df= df.sort_values(by=["Ticker", "Date"], ascending=[True,True]) 
df['Rank'] = df.groupby('Ticker')['Rank'].fillna(value=None, method="ffill") 

Allerdings möchte ich jetzt eine andere Spalte übertragen. Um diese Spalte zu erstellen ich folgendes tun:

import numpy as np 
    df["Code"]=np.NaN 

In dieser Funktion ich einige Code schreiben, dass etwa 200 Werte um 1 nach dem Datum und Ticker-Werte in der df „add“ ersetzt werden. Dieser Code worksand sieht wie folgt vor:

df["Code"][(df.Date == add) & (df["Ticker"] == column)] = 1 

Das macht meine Datenrahmen sieht wie folgt aus:

Ticker  Date    Rank   Code  
    1   01/01/2000   5    NaN 
    1   01/02/2000  NaN   NaN 
    2   01/01/2000   4    1 
    2   01/02/2000   2    NaN 

Nun, ich möchte diese Spalte Vortrages, aber der Code dauert ewig.

import pandas as pd 
df= df.sort_values(by=["Ticker", "Date"], ascending=[True,True]) 
df['Code'] = df.groupby('Ticker')['Code'].fillna(value=None, method="ffill") 

Ich habe es für zwei Tage ausgeführt und mein PC ist abgestürzt. Es muss hier ein Fehler in der Art und Weise sein, wie ich die Dinge mache, weil der obige Vortrag so schnell läuft und dieser nicht einmal endet. Ich habe den dtype von "Code" überprüft und es ist float64.

Kann jemand helfen?

+0

Schwierige Frage, warum es sehr lange Zeit. Aber ich glaube, wenn Gruppen bereits sortiert sind, fügen Sie 'sort = False' hinzu, um die Leistung zu verbessern. – jezrael

Antwort

1

Ich versuche, ein wenig Code mit sort=False-groupby und DataFrameGroupBy.ffill verbessern:

#convert column to datetime 
df["Date"] = pd.to_datetime(df["Date"]) 
#ascending can be omit, because default value 
df= df.sort_values(by=["Ticker", "Date"]) 

df['Rank'] = df.groupby('Ticker', sort=False)['Rank'].ffill() 
add = '01/01/2000' 
column = 2 

df.loc[(df.Date == add) & (df["Ticker"] == column), "Code"] = 1 

#sorting again is not necessary 
df['Code'] = df.groupby('Ticker', sort=False)['Code'].ffill() 
print (df) 
    Ticker  Date Rank Code 
0  1 2000-01-01 5.0 NaN 
1  1 2000-01-02 5.0 NaN 
2  2 2000-01-01 4.0 1.0 
3  2 2000-01-02 2.0 1.0 
+0

Danke, das funktioniert, aber das Problem ist immer noch mit der ffill. Vielleicht ist es ein Problem, dass Ticker kategorial ist? –

+0

Ich denke nicht. Problem ist kein Ersatz? Es scheint, dass es ein Problem mit Daten gibt. Ist es möglich, csv aus Daten zu erstellen und zu testen? Und wenn immer noch Probleme und Daten nicht vertraulich sind, senden Sie mir meine E-Mail in meinem Profil? – jezrael