2016-12-07 3 views
1

У меня есть dataframe net который содержит расстояние d между двумя местоположениями A и B.Python: как сопоставить значения между матрицей и фреймворком данных?

net = 
     A B d 
    0 5 3 3.5 
    1 2 0 2.3 
    2 3 2 1.2 
    3 4 5 2.2 
    4 0 1 3.2 
    5 0 3 4.5 

Тогда я симметричная матрица M, которая содержит все возможные расстояния между двумя парами, так:

M = 
    0 1 2 3 4 5 
0 0 3.2 2.3 4.5 1.7 5.2 
1 3.2 0 2.1 0.7 3.9 3.8 
2 2.3 2.1 0 1.2 1.5 4.7 
3 4.5 0.7 1.2 0 3.2 3.5  
4 1.7 3.9 1.5 3.2 0 2.2 
5 5.2 3.8 4.7 3.5 2.2 0 

Я хочу, чтобы создать новый dataframe df1, который содержит две случайных различные мест A и B в том же интервале расстояний ds > np.floor(d) & ds < np.floor(d)+1.

Это то, что я делаю

H = [] 
W = [] 
for i in net.index: 
    tmp = net['d'][i] 
    ds = np.where((M > np.floor(tmp)) & (M < np.floor(tmp)+1)) 
    size = len(ds[0]) 
    ind = randint(size) ## find two random locations with distance ds 
    h = ds[0][ind] 
    w = ds[1][ind] 
    H.append(h) 
    W.append(w) 
df1 = pd.DataFrame() 
df1['A'] = H 
df1['B'] = W 

ответ

1

группу M напольным разделения 1. Затем использовать, чтобы запрашивать и образец

g = M.stack().index.to_series().groupby(M.stack() // 1) 
net.d.apply(lambda x: pd.Series(g.get_group(x // 1).sample(1).iloc[0], list('AB'))) 

enter image description here

+0

Я получил сообщение об ошибке 'AttributeError: Объект 'numpy.ndarray' не имеет атрибута 'vstack' – emax