2017-11-22 2 views
0

Ich habe eine json die ich ein Wörterbuch am Umwandeln und dann bin die Schaffung I einen Datenrahmen unter Verwendung bestimmter Schlüssel-Wert-Paare, die in dem Wörterbuchpandas apply Rückkehr NaN

# json 
a = """{ 
    "cluster_id": 3, 
    "cluster_observation_data": [[1, 2, 3, 4, 5, 6, 7, 8], [2, 3, 4, 5, 6, 7, 8, 1]], 
    "cluster_observation_label": [0, 1], 
    "cluster_centroid": [1, 2, 3, 4, 5, 6, 7, 10], 
    "observation_id":["id_xyz_999","id_abc_000"] 
}""" 

# convert to dictionary 
data = json.loads(a) 
sub_dict = dict((k, data[k]) for k in ('cluster_observation_data', 'cluster_observation_label')) 
train = pd.DataFrame.from_dict(sub_dict, orient='columns') 

nachdem er einer ddataframe Umwandeln I ein Versuch, seinen euklidischen Abstand von dem , das in dem data Wörterbuch vorhanden ist, zu berechnen. Die Funktion funktioniert gut, aber in den letzten train Datenrahmen Ich erhalte NaNs

def distance_from_center(row): 
    centre = data['cluster_centroid'] 
    obs_data = row[0] 
    print('obs_data', obs_data) 
    print('\n\n\n\n') 
    print('center', centre) 
    # print(type(obs_data)) 
    # print(type(centre)) 
    dist = sum([(a - b)**2 for a, b in zip(centre, obs_data)]) 
    print(dist) 
    return dist 

train.loc[:, 'center_dist'] = train.loc[:, ['cluster_observation_data']].apply(distance_from_center) 

ich nicht in der Lage bin zu Figur wo es ist, dass ich falsch werde. sogar ein kleiner Hinweis genügt.

Antwort

1

Sie benötigen Achse passieren, wie:

train.loc[:, 'center_dist'] = train.loc[:, ['cluster_observation_data']].apply(distance_from_center, 1) 

Der Grund dafür ist, dass Sie Funktion zu jeder Liste inidividualy anwenden möchten. Documentation sagt:

1 oder 'columns':

0

gerade Funktion auf jede Zeile anwenden den Wert ändern obs_data in distance_from_center() aus row [0] zu Reihe, da Sie beim Aufruf dieser Methode bereits diese bestimmte Spalte verwenden. Dann sollte es gut gehen. Ich habe es versucht und es funktioniert in meinem System.

import json 
import pandas as pd 
# json 
a = """{"cluster_id": 3,"cluster_observation_data": [[1, 2, 3, 4, 5,6, 7, 8], [2, 3, 4,5, 6, 7, 8, 1]],"cluster_observation_label": [0, 1], 
"cluster_centroid": [1, 2, 3, 4, 5, 6, 7, 10], 
"observation_id":["id_xyz_999","id_abc_000"]}""" 

# convert to dictionary 
data = json.loads(a) 
sub_dict = dict((k, data[k]) for k in ('cluster_observation_data', 
'cluster_observation_label')) 
train = pd.DataFrame.from_dict(sub_dict, orient='columns') 

def distance_from_center(row): 
    centre = data['cluster_centroid'] 
    obs_data = row 
    print('obs_data', obs_data) 
    print('\n\n\n\n') 
    print('center', centre) 
    # print(type(obs_data)) 
    # print(type(centre)) 
    dist = sum([(a - b)**2 for a,b in zip(centre, obs_data)]) 
    print(dist) 
    return dist 

train.loc[:, 'center_dist'] = train.loc[:,'cluster_observation_data'].apply(distance_from_center) 

Ausgang:

obs_data [1, 2, 3, 4, 5, 6, 7, 8] 
center [1, 2, 3, 4, 5, 6, 7, 10] 
4 

obs_data [2, 3, 4, 5, 6, 7, 8, 1] 
center [1, 2, 3, 4, 5, 6, 7, 10] 
88