我有以下数据框:
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)
非常感谢
答案 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