2016-12-14 2 views
1

ich eine Textdatei, die Information in der Form umfasst:einen ‚repetitiven‘ 2D-Array in eine Matrix mit Python Transforming

A 0 
B 1 
C 4 
D 0 
E 1 
A 0 
B 0 
C 2 
D 1 
E 1 
A 1 
B 0 
C 2 
D 0 
E 0 
... 

anzumerken, dass die Gesamtzahl der ABCDE Zyklen (hier nur 3 dargestellt) ist nicht bekannt, ohne sie zu zählen. Ich möchte, mit Python, diese in eine Matrix zu verwandeln, die die Form hat:

A 0 0 1 ... 
B 1 0 0 ... 
C 4 2 2 ... 
D 0 1 0 ... 
E 1 1 0 ... 

Ich bin nicht sicher, was der beste Weg ist, diese Art von Transformation zu tun, hat jemand wie ein Python-Skript, das tut Dies? Gibt es irgendeine Funktion in Numpy oder Pandas, die es ermöglichen würde, dies leicht zu tun? Oder sollte ich es stattdessen ohne Numpy oder Pandas machen?

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

2

Pandas Lösung:

import pandas as pd 
from pandas.compat import StringIO 

temp=u""" 
A 0 
B 1 
C 4 
D 0 
E 1 
A 0 
B 0 
C 2 
D 1 
E 1 
A 1 
B 0 
C 2 
D 0 
E 0""" 
#after testing replace StringIO(temp) to filename 
df = pd.read_csv(StringIO(temp), sep="\s+", header=None) 
print (df) 
    0 1 
0 A 0 
1 B 1 
2 C 4 
3 D 0 
4 E 1 
5 A 0 
6 B 0 
7 C 2 
8 D 1 
9 E 1 
10 A 1 
11 B 0 
12 C 2 
13 D 0 
14 E 0 
df = pd.pivot(index=df[0], columns=df.groupby(0).cumcount(), values=df[1]) 
print (df) 
    0 1 2 
0   
A 0 0 1 
B 1 0 0 
C 4 2 2 
D 0 1 0 
E 1 1 0 
+0

Vielen Dank! es ist genau das, was ich brauchte! – ejl62

1

Option 1
einen Index-Ebene hinzufügen und unstack

s.index = [s.index, np.arange(len(s)) // 5] 
s.unstack() 

enter image description here

Option 2
rekonstruieren

pd.DataFrame(s.values.reshape(5, -1), s.index[:5]) 

enter image description here


Setup
Ich nahm eine Reihe mit einem Index als erste Spalte an.

import pandas as pd 
from pandas.compat import StringIO 

txt = """A 0 
B 1 
C 4 
D 0 
E 1 
A 0 
B 0 
C 2 
D 1 
E 1 
A 1 
B 0 
C 2 
D 0 
E 0""" 
s = pd.read_csv(StringIO(txt), sep="\s+", header=None, index_col=0, squeeze=True) 
+0

Vielen Dank. Für dieses spezielle habe ich eine Vorliebe für @jezrael-Lösung, da ich die Anzahl der Zeilen in der Matrix nicht angeben muss, aber es ist großartig, nur für den Fall einige alternative Methoden zu haben. – ejl62