2016-05-03 14 views
5

Ho la seguente dataframe:Come estrarre i valori di tupla nel dataframe di panda per l'uso di matplotlib?

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

x = np.arange(10) 
x = np.concatenate((x,x)) 
y = [] 
for i in range(2): 
    y.append(np.random.random_integers(0,10,20)) 

d = {'A': [(x[i], y[0][i]) for i in range(20)], 
    'B': [(x[i], y[1][i]) for i in range(20)]} 
df = pd.DataFrame(d, index = list('aaaaaaaaaabbbbbbbbbb')) 

df

A  B 
a (0, 2) (0, 10) 
a (1, 0) (1, 8) 
a (2, 3) (2, 8) 
a (3, 7) (3, 8) 
a (4, 8) (4, 10) 
a (5, 2) (5, 0) 
a (6, 1) (6, 4) 
a (7, 3) (7, 9) 
a (8, 4) (8, 4) 
a (9, 4) (9, 10) 
b (0, 0) (0, 3) 
b (1, 2) (1, 10) 
b (2, 8) (2, 3) 
b (3, 1) (3, 7) 
b (4, 6) (4, 1) 
b (5, 8) (5, 3) 
b (6, 1) (6, 4) 
b (7, 1) (7, 1) 
b (8, 2) (8, 7) 
b (9, 9) (9, 3) 

Come faccio a fare le seguenti trame?

Il grafico 1 è sulla colonna 'A', 2 righe (una riga per indice = a, l'altra per indice = b), i valori x sono i primi elementi delle tuple. I valori y sono i 2 elementi della tupla.

Plot 2 è in column'B', il resto è lo stesso grafico 1.

io non riesco a capire come posso estrarre i valori dai tuple nel dataframe.

Inoltre, il gruppo sarà utile in questo caso?

In realtà, ho circa mille colonne di dati, 5 gruppi, ogni gruppo ~ 500 righe. Quindi sto cercando un modo rapido per risolvere questo (dimensioni dataframe ~ 2500 x 1000)

Grazie mille

+0

Potrebbe essere necessario smanettare un po ', ma qualcosa di simile 'np.rollaxis (np.vstack (df.values.flatten()) .reshape (2, 20, 2), 2) 'puoi ottenere un array 3D che puoi facilmente indicizzare in modo da specificare esattamente i dati che vuoi tracciare (e possibilmente, puoi ottenere quella linea un po 'più breve e più leggibile anche). – Evert

risposta

6

Ecco come togliere l'imballo del tuple utilizzando zip. *unpacks the argument list di ogni colonna.

df['A.x'], df['A.y'] = zip(*df.A) 
df['B.x'], df['B.y'] = zip(*df.B) 

>>> df.head() 
     A  B A.x A.y B.x B.y 
a (0, 6) (0, 0) 0 6 0 0 
a (1, 8) (1, 4) 1 8 1 4 
a (2, 8) (2, 5) 2 8 2 5 
a (3, 5) (3, 2) 3 5 3 2 
a (4, 2) (4, 4) 4 2 4 4 
0

Penso che si può utilizzare solo indexing with str:

df['a1'], df['a2'] = df['A'].str[0], df['A'].str[1] 
df['b1'], df['b2'] = df['B'].str[0], df['B'].str[1] 

print (df) 
     A  B a1 a2 b1 b2 
a (0, 5) (0, 1) 0 5 0 1 
a (1, 0) (1, 5) 1 0 1 5 
a (2, 3) (2, 9) 2 3 2 9 
a (3, 3) (3, 8) 3 3 3 8 
a (4, 7) (4, 9) 4 7 4 9 
a (5, 9) (5, 4) 5 9 5 4 
a (6, 3) (6, 3) 6 3 6 3 
a (7, 5) (7, 0) 7 5 7 0 
a (8, 2) (8, 3) 8 2 8 3 
a (9, 4) (9, 5) 9 4 9 5 
b (0, 7) (0, 0) 0 7 0 0 
b (1, 6) (1, 2) 1 6 1 2 
b (2, 8) (2, 3) 2 8 2 3 
b (3, 8) (3, 8) 3 8 3 8 
b (4, 10) (4, 1) 4 10 4 1 
b (5, 1) (5, 3) 5 1 5 3 
b (6, 6) (6, 3) 6 6 6 3 
b (7, 7) (7, 3) 7 7 7 3 
b (8, 7) (8, 7) 8 7 8 7 
b (9, 8) (9, 0) 9 8 9 0 
+0

Grazie mille. –

+0

Grazie. Qual è la differenza tra pd.pivot e df.pivot? Nella tua risposta, usi pd.pivot. Ho provato df.pivot ma dice "gli indici sono fuori campo". Grazie. –

Problemi correlati