2017-01-05 25 views
9

Grafik temsil eden pandalar DataFrame ile çalışıyorum. Veri çerçevesi, düğüm bitiş noktalarını belirten bir MultiIndex ile endekslenir.Pandalar Numpy dizileriyle MultiIndex araması

Kurulumu:

Ben MultiIndex kullanmayı tercih ettik yüzden bir kenar alt kümesini kullanarak grafiğin içine dizine mümkün istiyorum
import pandas as pd 
import numpy as np 
import itertools as it 
edges = list(it.combinations([1, 2, 3, 4], 2)) 

# Define a dataframe to represent a graph 
index = pd.MultiIndex.from_tuples(edges, names=['u', 'v']) 
df = pd.DataFrame.from_dict({ 
    'edge_id': list(range(len(edges))), 
    'edge_weight': np.random.RandomState(0).rand(len(edges)), 
}) 
df.index = index 
print(df) 
## -- End pasted text -- 
    edge_id edge_weight 
u v      
1 2  0  0.5488 
    3  1  0.7152 
    4  2  0.6028 
2 3  3  0.5449 
    4  4  0.4237 
3 4  5  0.6459 

. Bunu, df.loc numaralı girdinin bir tupl listesi olduğu sürece yapabilirim. kenarlarının benim listesi (genellikle olduğu gibi) bir numpy dizidir veya listelerin listesi ne zaman

# Select subset of graph using list-of-tuple indexing 
edge_subset1 = [edges[x] for x in [0, 3, 2]] 
df.loc[edge_subset1] 
## -- End pasted text -- 
    edge_id edge_weight 
u v      
1 2  0  0.5488 
2 3  3  0.5449 
1 4  2  0.6028 

Ancak, o zaman ben df.loc özelliğini kullanmak mümkün görünmektedir.

# Why can't I do this if `edge_subset2` is a numpy array? 
edge_subset2 = np.array(edge_subset1) 
df.loc[edge_subset2] 
## -- End pasted text -- 
TypeError: unhashable type: 'numpy.ndarray' 

Ben sadece tüm arr.tolist(), ancak bu görünüşte farklı hatasına yol açar eğer Tamam olurdu.

# Why can't I do this if `edge_subset2` is a numpy array? 
# or if `edge_subset3` is a list-of-lists? 
edge_subset3 = edge_subset2.tolist() 
df.loc[edge_subset3] 
## -- End pasted text -- 
TypeError: '[1, 2]' is an invalid key 

Gerçek bir ağrı bir alt kümesini seçmek istediğiniz her seferinde list(map(tuple, arr.tolist())) kullanmak zorunda kalmak var. Bunu yapmanın başka bir yolu olsaydı iyi olurdu.

ana gösterilen sorular şunlardır:

  • Neden .loc ile numpy dizi kullanamıyorum? Kaputun altında, çoklu indeks etiketlerini konum endekslerine eşlemek için bir sözlük kullanılıyor mu?

  • Listeler listesi neden farklı bir hata veriyor? Belki de gerçekten aynı sorun sadece farklı bir şekilde yakalandı?

  • Veri kümesinin bir alt kümesini, farkında olmadığım çok dizili etiketlerin bir dizi dizisini aramak için başka (ideal olarak daha az ayrıntılı) bir yol var mı?

+0

Not: df.edge_id [edge_subset2] 'çalışır - bu, bir dizin üzerinde bir dizinde desteklenir, ancak bir nedenle DataFrame desteklenmez. Tuhaf olarak, 'df.edge_id.loc [edge_subset2]' da (hiçbir sebepten dolayı, "loc" olmadan çalıştığı için) başarısız olur. Bunu Panda'lara göndermeni öneririm: https://github.com/pandas-dev/pandas/issues –

cevap

2

bir sözlük tuşları çoklu indeksine erişmek için listelerin bir listesini cant'kullanma yüzden temelde, değişken değildir.

loc kullanarak çok indeksli verilere erişebilmek için, numpy dizininizi bir tuple listesine dönüştürmeniz gerekir; tuplelar değiştirilemez, haritayı kullanmaktan kaçınmak istiyorsanız ve bir csv dosyasını oluşturan kenarları okuyorsanız, daha sonra birlikte to_records kullanmak veri çerçevesi içine okuyabilir Eğer

belirtildiği gibi map kullanıyor bunu tek yönlü index nitelik bir başka yolu ndarray bir çok dizin oluşturarak olabilir, False ayarlı ancak her seviyede buldum

import pandas as pd 

df1 = df.loc[pd.MultiIndex.from_arrays(edge_subset2.T)] 


print(df1) 

#outputs 
      edge_id edge_weight 
------ --------- ------------- 
(1, 2)   0  0.548814 
(2, 3)   3  0.544883 
(1, 4)   2  0.602763 

dizide bir liste olacak şekilde geçirmeden önce listeyi devrik zorunda pandas dokümanındaki advanced multi-indexing numaralı makale çok yararlı