Pandas:点大小由一列的唯一值相对于另一列的相应值确定的散点图
Pandas: scatterplot with points sized by unique values of one column against the corresponding values of another column
给定以下样本数据框:
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'])
组的key里面有我要的数据,但是没有排序:
group.group.keys()
[(1, 2), (1, 3), (3, 1), (2, 1), (2, 2), (1, 1)]
'first' 方法 returns 看起来像 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])
然而,这看起来非常笨拙,这表明我还不了解如何正确使用该组。
IIUC 也许你可以 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']
要一次获得您需要的所有列表,您可以:
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
尺寸:
In [91]: group['s'].tolist()
Out[91]: [1, 1, 1, 1, 2, 3]
甲:
In [92]: group['A'].tolist()
Out[92]: [1, 1, 1, 2, 2, 3]
乙:
In [93]: group['B'].tolist()
Out[93]: ['x', 'y', 'z', 'x', 'y', 'x']
编辑:在最后一个数据框中,您拥有所需的所有信息,因此您可以只保留最后一个数据框来获取所有列表。
给定以下样本数据框:
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'])
组的key里面有我要的数据,但是没有排序:
group.group.keys()
[(1, 2), (1, 3), (3, 1), (2, 1), (2, 2), (1, 1)]
'first' 方法 returns 看起来像 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])
然而,这看起来非常笨拙,这表明我还不了解如何正确使用该组。
IIUC 也许你可以 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']
要一次获得您需要的所有列表,您可以:
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
尺寸:
In [91]: group['s'].tolist()
Out[91]: [1, 1, 1, 1, 2, 3]
甲:
In [92]: group['A'].tolist()
Out[92]: [1, 1, 1, 2, 2, 3]
乙:
In [93]: group['B'].tolist()
Out[93]: ['x', 'y', 'z', 'x', 'y', 'x']
编辑:在最后一个数据框中,您拥有所需的所有信息,因此您可以只保留最后一个数据框来获取所有列表。