2016-05-03 11 views
5

Mam następujący dataframe:Jak wyodrębnić wartości krotek w ramce danych pandy dla użycia 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) 

Jak mogę dokonać następujących działek?

Wykres 1 znajduje się w kolumnie "A", 2 linie (jedna linia dla indeksu = a, druga dla indeksu = b), wartości x są pierwszymi elementami krotek. wartości y są 2. elementami krotki.

Działka 2 jest column'B”, reszta jest taka sama jak działce 1.

nie mogę dowiedzieć się, w jaki sposób można wyodrębnić wartości z krotek w dataframe.

Co więcej, będzie w tym przypadku pomocne?

W rzeczywistości mam około tysiąca kolumn danych, 5 grup, każda grupa ~ 500 wierszy. Więc szukam szybki sposób na rozwiązanie tego (rozmiar dataframe ~ 2500 x 1000)

dzięki dużo

+0

Być może trzeba pobawić się trochę, ale coś takiego jak 'np.rollaxis (np.vstack (df.values.flatten()) .reshape (2, 20, 2), 2) 'może dostarczyć ci tablicę 3D, którą możesz łatwo zindeksować, abyś dokładnie określił dane, które chcesz wydrukować (i ewentualnie, możesz ustawić tę linię nieco krótszą i bardziej czytelną także). – Evert

Odpowiedz

6

Oto sposób rozpakowania krotki używając zip. W każdej kolumnie znajduje się *unpacks the argument list.

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

Myślę, że można używać tylko 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

Niż bardzo. –

+0

Dzięki. Jaka jest różnica między pd.pivot i df.pivot? W swojej odpowiedzi używasz pd.pivot. Próbowałem df.pivot, ale mówi "indeksy są poza granicami". Dzięki. –

Powiązane problemy