Ich habe eine Liste von Wörterbüchern mit Werten, die als Numpy-Arrays zurückgegeben werden (und die oft leer sind).

data=[{'width': array([])},
      {'width': array([])},
      {'width': array([])},
      {'width': array([])},
      {'width': array([])},
      {'width': array([ 0.64848222])},
      {'width': array([ 0.62241745])},
      {'width': array([ 0.76892571])},
      {'width': array([ 0.69913647])},
      {'width': array([ 0.7506934])},
      {'width': array([ 0.69087949])},
      {'width': array([ 0.65302866])},
      {'width': array([ 0.67267989])},
      {'width': array([ 0.63862089])}]

Ich möchte einen DataFrame erstellen, bei dem die Werte Floats sind und nicht vom Typ numpy array dtype. Außerdem möchte ich, dass die leeren Arrays in NaN-Werte konvertiert werden.

Ich habe versucht, df=pd.DataFrame(data, dtype=float) zu verwenden, das einen DataFrame mit Werten wie np.arrays als solchen zurückgibt:

               width
0                 []
1                 []
2                 []
3                 []
4                 []
5   [0.648482224582]
6   [0.622417447245]
7   [0.768925710479]
8   [0.699136467373]
9    [0.75069339816]
10  [0.690879488242]
11  [0.653028655088]
12  [0.672679885077]
13  [0.638620890633]

Ich habe auch versucht, die Werte des df nach dem Erstellen mit df.values.astype(float) neu zu formulieren, erhalte jedoch den folgenden Fehler: ValueError: setting an array element with a sequence.

Die endgültige Ausgabe, die ich für den Datenrahmen erhalten möchte, sieht folgendermaßen aus:

               width
0                NaN
1                NaN
2                NaN
3                NaN
4                NaN
5     0.648482224582
6     0.622417447245
7     0.768925710479
8     0.699136467373
9      0.75069339816
10    0.690879488242
11    0.653028655088
12    0.672679885077
13    0.638620890633
1
pamplemoose 13 Aug. 2015 im 23:59

3 Antworten

Beste Antwort

Nachdem Sie den DataFrame aus data erstellt haben, müssen Sie nur noch Folgendes tun:

df.width = df.width.str[0]

Dies funktioniert, weil wir nur den Accessor .str verwenden, um das erste Element jeder Liste abzurufen. Leere Listen haben kein erstes Element, daher wird NaN für diese Zeilen zurückgegeben.

Am Ende erhalten Sie eine Spalte mit float64-Werten:

       width
0        NaN
1        NaN
2        NaN
3        NaN
4        NaN
5   0.648482
6   0.622417
7   0.768926
8   0.699136
9   0.750693
10  0.690879
11  0.653029
12  0.672680
13  0.638621

Hinweis: Wenn Sie mehr Dezimalstellen anzeigen möchten, müssen Sie die Float-Genauigkeit mit pd.set_options anpassen.

Alternativ können Sie die Liste verarbeiten, bevor Sie den DataFrame erstellen:

pd.DataFrame([x.get('width') for x in data], columns=['width'])
1
Alex Riley 13 Aug. 2015 im 21:52

Sie können ein Listenverständnis verwenden, um die Daten aus dem Array im Wörterbuch zu extrahieren. d['width'][0] extrahiert den ersten Wert aus dem Array. if d['width'].shape[0] wird zu False ausgewertet, wenn das Array leer ist. In diesem Fall wird None eingefügt.

>>> pd.DataFrame([d['width'][0] if d['width'].shape[0] else None for d in data], 
                 columns=['width'])
       width
0        NaN
1        NaN
2        NaN
3        NaN
4        NaN
5   0.648482
6   0.622417
7   0.768926
8   0.699136
9   0.750693
10  0.690879
11  0.653029
12  0.672680
13  0.638621
1
Alexander 13 Aug. 2015 im 21:26

Versuchen Sie dies, nachdem Sie den von Ihnen geposteten Datenrahmen erhalten haben:

def convert(x):
    if len(x) == 0:
            return np.nan
    else:
        return x[0]

 df['width'] = df['width'].apply(lambda x: convert(x))
0
DeepSpace 13 Aug. 2015 im 21:04