2016-04-05 5 views
2

Verwendung Haben Sie eine Daten in einem solchen Format in TXT-Datei:Laden von Daten-Arrays in Python

UserId WordID 
    1  20 
    1  30 
    1  40 
    2  25 
    2  16 
    3  56 
    3  44 
    3  12 

Was for- eine Funktion Ich bin auf der Suche, die das Ergebnis Gruppierung für jede Benutzer-ID Erstellen einer Liste von wordid geben kann :

[[20, 30, 40], [25, 16], [56, 44, 12]]

Was ich versucht, lautet:

def loadSet(path='/data/file.txt'): 
    datset={} 
    for line in open(path+'/file.txt'): 
    (userid,wordid)=line.split('\t') 
    dataset.setdefault(user,{}) 
    dataset[userid][wordid]=float(wordid) 
    return dataset 

Aber ich kann damit nicht umgehen. Können Sie mir bitte den richtigen Ansatz dafür geben?

Antwort

1

ich glaube, Sie groupby mit applytolist mit values verwenden:

print df.groupby('UserId')['WordID'].apply(lambda x: x.tolist()).values 
[[20, 30, 40] [25, 16] [56, 44, 12]] 

list Oder gelten, danke B.M.

print df.groupby('UserId')['WordID'].apply(list).values 
[[20, 30, 40] [25, 16] [56, 44, 12]] 

Timings:

df = pd.concat([df]*1000).reset_index(drop=True) 

In [358]: %timeit df.groupby('UserId')['WordID'].apply(list).values 
1000 loops, best of 3: 1.22 ms per loop 

In [359]: %timeit df.groupby('UserId')['WordID'].apply(lambda x: x.tolist()).values 
1000 loops, best of 3: 1.23 ms per loop 
+1

Sie sind der Schnellste. oder: df.groupby ('UserId') ['WordID']. apply (Liste) .tolist() –

+0

Zuerst denke ich, dass meine Lösung am schnellsten ist, also versuche ich Timings. :) – jezrael

0

, während Sie mehr interessiert sein könnte es in pandas je nach Zweck, die numpy Weise würde dabei sein:

userid,wordid = np.loadtxt('/data/file.txt',skiprows=1,unpack=True) 
#example use: 
mylist = [] 
for uid in np.unique(userid): 
    mylist.append(wordid[userid==uid]) 
0

Wenn Sie mit Performance-Problemen betroffen sind, wie oft numpy besser ist:

df=pd.read_csv('file.txt') 
def numpyway(): 
    u,v=df.values.T 
    ind=argsort(u,kind='mergesort') # stable sort to preserve order 
    return np.split(v[ind],add(1,*where(diff(u[ind])))) 


In [12]: %timeit numpyway() # on 8000 lines 
10000 loops, best of 3: 250 µs per loop 

Wenn 'UserId' bereits sortiert ist, ist es noch dreimal schneller.

Verwandte Themen