2016-05-03 2 views
5

У меня есть следующие dataframe:Как извлечь значения кортежа в dataframe pandas для использования 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')) 

ДФ

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) 

Как сделать следующие участки?

Участок 1 находится в столбце «A», 2 строки (одна строка для индекса = a, другая для индекса = b), значения x являются первыми элементами кортежей. y - это 2-й элемент кортежа.

Участок 2 находится на column'B», остальное же, как и сюжет 1.

Я не могу понять, как я могу извлечь значения из кортежей в dataframe.

Кроме того, группа будет полезна в этом случае?

В действительности у меня около тысячи столбцов данных, 5 групп, каждая группа ~ 500 строк. Поэтому я ищу быстрый способ решения этой (размер dataframe ~ 2500 х 1000)

Спасибо большое

+0

Вы, возможно, придется возиться немного, но что-то вроде 'np.rollaxis (np.vstack (df.values.flatten()) .reshape (2, 20, 2), 2) 'может получить вам 3D-массив, который вы можете легко индексировать, чтобы точно указать данные, которые вы хотите построить (и, возможно, вы можете получить эту строку немного короче и читабельнее также). – Evert

ответ

6

Вот как распаковать кортежей с помощью zip. *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

Я думаю, что вы можете использовать только 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

Чем вы очень. –

+0

Спасибо. В чем разница между pd.pivot и df.pivot? В вашем ответе вы используете pd.pivot. Я пробовал df.pivot, но он говорит, что «индексы вне пределов». Благодарю. –

Смежные вопросы