如何在pandas数据帧中提取元组值以使用matplotlib?

时间:2016-05-03 06:06:00

标签: python pandas matplotlib plot tuples

我有以下数据框:

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)

如何制作以下图表?

Plot 1位于列' A',2行(index = a的一行,index = b的另一行),x值是元组的第一个元素。 y值是元组的第二个元素。

图2位于列' B',其余与图1相同。

我无法弄清楚如何从数据框中的元组中提取值。

另外,在这种情况下,groupby会有所帮助吗?

实际上,我有大约一千列数据,5组,每组~500行。所以我正在寻找一种快速解决方法(数据框大小~2500 x 1000)

非常感谢

2 个答案:

答案 0 :(得分:8)

以下是使用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

答案 1 :(得分:1)

我认为你只能使用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