2017-12-10 1 views
1

Ich habe einen Datenrahmen wie diesePandas für die Zuordnung in einem Multi-Index mit loc Datenrahmen

initialisiert
df = pd.DataFrame(columns=["stockname","timestamp","price","volume"]) 
df.timestamp = pd.to_datetime(df.timestamp, format = "%Y-%m-%d %H:%M:%S:%f") 
df.set_index(['stockname', 'timestamp'], inplace = True) 

ich jetzt Datenstrom von irgendwo bekommen, aber im Interesse des Programms lassen Sie mich es so

schreiben
filehandle = open("datasource") 

for line in filehandle: 
    line = line.rstrip() 
    data = line.split(",") 
    stockname = data[4] 
    price = float(data[3]) 
    timestamp = pd.to_datetime(data[0], format = "%Y-%m-%d %H:%M:%S:%f") 
    volume = int(data[6]) 

    df.loc[stockname, timestamp] = [price, volume] 

filehandle.close() 

print df 

but this is giving error 

    ValueError: cannot set using a multi-index selection indexer with a different length than the value 
+1

Können Sie ein hinzufügen Beispiel von '" Datenquelle "'? – Dark

+0

Wissen Sie, Sie müssen nicht die ganze schwere Arbeit von Striping, Splitten, einfach 'pd.read_csv' verwenden. Wenn Sie das Beispiel der Textdatei hinzufügen, würde ich Ihnen zeigen, wie das geht. – Dark

Antwort

2

die Spaltennamen angeben Sie Daten zuweisen dh

df = pd.DataFrame(columns=["a","b","c","d"]) 
df.set_index(['a', 'b'], inplace = True) 

df.loc[('3','4'),['c','d']] = [4,5] 

df.loc[('4','4'),['c','d']] = [3,1] 

     c d 
a b   
3 4 4.0 5.0 
4 4 3.0 1.0 

Auch wenn Sie eine durch Komma getrennte Datei haben, dann können Sie read_csv dh verwenden:

import io 
import pandas as pd 
st = '''2017-12-08 15:29:58:740657,245.0,426001,248.65,APPL,190342,2075673,249.35,244.2 
     2017-12-08 16:29:58:740657,245.0,426001,248.65,GOOGL,190342,2075673,249.35,244.2 
     2017-12-08 18:29:58:740657,245.0,426001,248.65,GOOGL,190342,2075673,249.35,244.2 
     ''' 
#instead of `io`, add the source name 
df = pd.read_csv(io.StringIO(st),header=None) 
# Now set the index and select what you want 
df.set_index([0,4])[[1,7]] 

            1  7 
0       4     
2017-12-08 15:29:58.740657 APPL 245.0 249.35 
2017-12-08 16:29:58.740657 GOOGL 245.0 249.35 
2017-12-08 18:29:58.740657 GOOGL 245.0 249.35 
+0

dies funktionierte. Jetzt sehen Sie, dass ich Stockname und Zeitrahmen habe. Ich möchte alle Daten über einen bestimmten Titel zugreifen, aber ich kann nicht df schreiben [df.index == „XYZ“] so, wie ich schreibe eine bestimmte Bestandsdaten aus Datenrahmen zugreifen? – Tahseen

+0

@Tahseen Ich muss sehen, wie die Daten tatsächlich aussieht – Dark

+0

2017.12.08 15: 29: 58: 740657,245.0,426001,248.65, APPL, 190342,2075673,249.35,244.2 – Tahseen

1

ich denke, was Sie suchen ist:

df.loc[a,b,:] = [c,d] 

Hier ein Beispiel mit Ihrem Datenrahmen ist :

for i in range(3): 
    for j in range(3): 
     df.loc[(str(i),str(j)),:] = [i,j] 

Ausgang:

 c d 
a b  
0 0 0 0 
    1 0 1 
    2 0 2 
1 0 1 0 
    1 1 1 
    2 1 2 
2 0 2 0 
    1 2 1 
    2 2 2 
+0

ix ist veraltet. Auch Datenframe nach Schleife war leer, selbst nach der Verwendung von ix – Tahseen

+0

Ich aktualisierte meine Antwort – AndreyF

Verwandte Themen