2017-10-06 4 views
0
python 3.5.2 
numpy 1.11.1 

Ich habe Probleme erstellen dataframe von einem 2-dimensional list Erstellen von Aufspaltung eine Textdatei erstellt. Hier ist ein Beispiel der Textdatei:kann keine Pandas Datenrahmen aus 2D-Liste

#freq [MHz] #flags #total %flagged\n947.6 1451736.0 1451736.0 
1.0\n947.615625 1451736.0 1451736.0 1.0\n947.63125 1451736.0 1451736.0 
1.0\n947.646875 1451736.0 1451736.0 1.0\n947.6625 1451736.0 1451736.0 
1.0\n947.678125 1451736.0 1451736.0 1.0\n947.69375 1451736.0 1451736.0 
1.0\n947.709375 1451736.0 1451736.0 1.0\n947.725 1451736.0 1451736.0 
1.0\n947.740625 1451736.0 1451736.0 1.0\n947.75625 1451736.0 1451736.0 
1.0\n947.771875 1451736.0 1451736.0 1.0\n947.7875 1451736.0 1451736.0 
1.0\n947.803125 1451736.0 1451736.0 1.0\n947.8 .... 

So sind die Linien durch \n getrennt sind, und jede Spalte durch eine space getrennt ist. Ich analysiere this out mit:

obs_array = [] 
obs_1 = obs_txts[obs].split('\n') 
for i in range(0,len(obs_1)): 
    obs_array.append(obs_1[i].split(' ')) 

So bekomme ich obs_array als 2-dimensionale Liste. Ich werde die first row (nur Spaltennamen, ich werde umbenennen, sobald ich eine funktionierende dataframe habe) und die last row, die nur eine leere '' ist. Also, ich habe jetzt eine zweidimensionale Liste, die 30720 rows und 4 columns hat. Ich kann dies in ein Array umwandeln:

obs_array = np.array(obs_array) 

aber die Form dieses Arrays zurück (30720,). Ich überprüfte die Länge jeder Reihe, jedes gibt 4 zurück und versucht, die Form zu zwingen, zu sein (30720,4) gibt eine size error zurück. Ich weiß sicher, dass es 30720 Zeilen geben sollte. Setzen dieses in eine dataframe

obs_df = pd.DataFrame(obsarray) 

kehrt

0 

0 [947.6, 1451736.0, 1451736.0, 1.0] 

1 [947.615625, 1451736.0, 1451736.0, 1.0] 

2 [947.63125, 1451736.0, 1451736.0, 1.0] 

3 [947.646875, 1451736.0, 1451736.0, 1.0] 

4 [947.6625, 1451736.0, 1451736.0, 1.0] 

Mit anderen Worten, ein 30720x1 dimensioned dataframe wobei jede Zeile einen Eintrag hat: eine Liste dieser Zeile.

Was geht hier vor? Warum kann ich Python nicht dazu bringen, obs_array mit der Form (30720,4) zu interpretieren? Danke für jede Hilfe.

+0

Ich bin wirklich verwirrt, warum Sie 'pd.read_table' nicht einfach verwenden können, um die Datei zu importieren? Versuchen Sie auf jeden Fall, obs_df = pd.DataFrame.from_records (obs_array) '. – Abdou

+0

War pd.read_table nicht bekannt. Dies funktioniert, wenn auch etwas grob, da es die erste Zeile mit 6 Elementen interpretiert, aber das ist leicht zu beheben. Vielen Dank! – socxc9

Antwort

0

So nach obs_array = np.array(obs_array) können Sie pd.DataFrame(obs_array.tolist()) ausführen, die Ihnen die folgenden Datenrahmen geben:

 0  1   2   3  4  5 
    0  #  freq  [MHz] #flags #total %flagged 
    1 947.6  1451736.0 1451736.0 1.0 None None 
    2 947.615625 1451736.0 1451736.0 1.0 None None 
    3 947.63125 1451736.0 1451736.0 1.0 None None 
    4 947.646875 1451736.0 1451736.0 1.0 None None 
    5 947.6625 1451736.0 1451736.0 1.0 None None 
    6 947.678125 1451736.0 1451736.0 1.0 None None 
    7 947.69375 1451736.0 1451736.0 1.0 None None 
    8 947.709375 1451736.0 1451736.0 1.0 None None 
    9 947.725  1451736.0 1451736.0 1.0 None None 
10 947.740625 1451736.0 1451736.0 1.0 None None 
11 947.75625 1451736.0 1451736.0 1.0 None None 
12 947.771875 1451736.0 1451736.0 1.0 None None 
13 947.7875 1451736.0 1451736.0 1.0 None None 
14 947.803125 1451736.0 1451736.0 1.0 None None 

hoffe, das hilft und lassen Sie mich wissen, wenn Sie Fragen haben.

Verwandte Themen