Pandas:散点图,其点大小由一列的唯一值与另一列

时间:2017-02-15 10:14:16

标签: python pandas scatter-plot

给出以下示例Dataframe:

df = pd.DataFrame( { 'A' : [ 1, 1, 1, 2, 2, 2, 3, 3, 3 ],
                     'B' : [ 'x', 'y', 'z', 'x', 'y', 'y', 'x', 'x', 'x' ] } )

我想生成一个B的唯一值的散点图(其中每个唯一值组中的B值的大小除以它们对应的A值),所以我想得到以下三个列表:

A = [ 1, 1, 1, 2, 2, 3 ]
B = ['x', 'y', 'z', 'x', 'y', 'x']
Bsize = [ 1, 1, 1, 1, 2, 3]

我已经尝试过使用groupby:

group = df.groupby(['A','B'])

该组的密钥包含我想要的数据,但它们没有订购:

group.group.keys()
[(1, 2), (1, 3), (3, 1), (2, 1), (2, 2), (1, 1)]

第一个'方法返回看起来像Dataframe的内容,但我无法访问' A'和' B'键:

group.first()['A']
...
KeyError: 'A'

如果我遍历名称和组,事情似乎是有序的,所以我可以通过这样做得到我想要的东西:

A = []
B = []
for name, _ in group:
    A.append(name[0])
    B.append(name[1])

然后我可以通过以下方式获取Bsize列表:

group['B'].count().values
array([1, 1, 1, 1, 2, 3])

然而,这似乎极端笨拙,并告诉我,我还没有理解如何正确使用该群体。

1 个答案:

答案 0 :(得分:1)

IIUC也许你可以export LD_LIBRARY_PATH="/usr/local/lib/cuda-8.0/lib64:/usr/local/lib/cudann5/lib64/"和:

import numpy as np

然后:

In [52]: group = df.groupby(['A','B']).apply(np.unique).reset_index()

In [53]: group
Out[53]: 
   A  B       0
0  1  x  [1, x]
1  1  y  [1, y]
2  1  z  [1, z]
3  2  x  [2, x]
4  2  y  [2, y]
5  3  x  [3, x]

一次性获取所需的所有列表:

In [57]: A = group['A'].tolist()

In [58]: B = group['B'].tolist()

In [59]: A
Out[59]: [1, 1, 1, 2, 2, 3]

In [60]: B
Out[60]: ['x', 'y', 'z', 'x', 'y', 'x']

BSIZE:

In [87]: group = df.groupby(['A','B']).size().reset_index(name='s')

In [88]: group
Out[88]: 
   A  B  s
0  1  x  1
1  1  y  1
2  1  z  1
3  2  x  1
4  2  y  2
5  3  x  3

A:

In [91]: group['s'].tolist()
Out[91]: [1, 1, 1, 1, 2, 3]

B:

In [92]: group['A'].tolist()
Out[92]: [1, 1, 1, 2, 2, 3]

编辑:在最后一个数据框中,您拥有所需的所有信息,因此您只能保留最后一个信息以获取所有列表。