2016-09-16 5 views
1

Ich habe eine Xlsx-Datei mit über 1000 Datenspalten. Ich möchte zuerst jede zweite Spalte aus der Datendatei analysieren (die Zahlen und Buchstaben enthalten kann) und dann eine eindeutige Liste aus den geparsten Daten erstellen.Erstellen einer eindeutigen Liste mit Pandas

Ich bin ein komplettes noob & habe versucht, eine "für" und "tun, während" Schleife, aber keiner hat für mich gearbeitet.

Bisher habe ich:

import pandas as pd 
    workbook = pd.read_excel('C:\Python27\Scripts\Data.xlsx') 
    worksheet = workbook.sheetname='Data' 

    for col in range(worksheet[0], worksheet[1300]): 
     print(col) 

Ich glaube, ich brauche die Daten anhängen und vielleicht in eine Textdatei schreiben dann eine eindeutige Liste aus der Textdatei erstellen - ich den zweiten Teil tun kann, es nur wird immer es in die Textdatei, mit der ich Probleme habe.

Dank

+0

Entschuldigung, wenn Sie sagen, dass jede zweite Spalte nur eine zweite Spalte oder eine gerade Spalte bedeutet? Wünschen Sie auch eine globale Liste oder eine Liste pro Spalte? Haben Sie sich auch ['unique'] angesehen (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.unique.html#pandas.Series.unique)? – EdChum

+0

Dank Ed, es ist jede gerade Spalte - 0,2,4,6,8, etc, oder A, C, E, G, ich den ganzen Weg nach AWK. Es gibt insgesamt 1286 Spalten, also würde ich gerne eine Liste von 643 erstellen und dann aus dieser Liste eine eindeutige Liste erstellen. Ich werde definitiv Pandas.series.unique() verwenden, aber ich bin mir nicht sicher, wie man die 643 Spalten in eine Liste bringt. –

Antwort

2

Sie können durch Schneiden und mit einem Schritt arg dh df.ix[:, ::2] über Ihre Spalten iterieren

In [35]: 
df = pd.DataFrame({'a':1, 'b':[1,2,3,4,5], 'c':[2,3,4,5,6], 'd':0,'e':np.random.randn(5)}) 
df 

Out[35]: 
    a b c d   e 
0 1 1 2 0 -0.352310 
1 1 2 3 0 1.189140 
2 1 3 4 0 -1.470507 
3 1 4 5 0 0.742709 
4 1 5 6 0 -2.798007 

hier treten wir jeden 2. Säule:

In [37]: 
df.ix[:,::2] 

Out[37]: 
    a c   e 
0 1 2 -0.352310 
1 1 3 1.189140 
2 1 4 -1.470507 
3 1 5 0.742709 
4 1 6 -2.798007 

können wir dann rufen Sie einfach np.unique über die gesamte df, um ein einziges Array aller eindeutigen Werte zu erhalten:

In [36]: 
np.unique(df.ix[:,::2]) 

Out[36]: 
array([-2.79800676, -1.47050675, -0.35231005, 0.74270934, 1.  , 
     1.18914011, 2.  , 3.  , 4.  , 5.  , 6.  ]) 
+0

Sehr schön. Im Allgemeinen ist es beim Aufruf von "numpy" -Funktionen nicht notwendig, 'as_matrix' aufzurufen. Ich erinnere mich vage daran, dass "Sklearn" verärgert ist, wenn ich das nicht tue. –

+0

@AmiTavory Ich dachte sklearn war in diesen Tagen viel besser im Umgang mit dfs und series als Datenargumente, aber ziemlich oft passierte ich 'df.values', denke ich' np' spielt ziemlich gut mit Datenrahmen, historisch gab es einige Fälle, in denen "np" das Attribut "__array__" nicht korrekt aufruft, aber kürzlich nicht oft aufgetreten ist – EdChum

+0

Danke, Leute, ich bin fast da. Ich scheine immer noch alle Daten zurück zu bekommen, wenn ich drucke: df.ix [:, :: 2]. Die np.unique() sollte trotzdem funktionieren, ist das richtig? –

Verwandte Themen