Groupby项和计数散点图?

时间:2019-09-26 19:47:04

标签: pandas

我有一个类似于以下数据框:

    id      date       available    
0   1944    2019-07-11  f               
1   1944    2019-07-11  t           
2   159454  2019-07-12  f           
3   159454  2019-07-13  f         
4   159454  2019-07-14  f          

我想形成一个散点图,其中每个id都有一个对应的点; x值是t列中出现的次数f,y值是available列中有grouped = df.groupby(['listing_id'])['available'].value_counts().to_frame() grouped.head() 个出现的次数。

我尝试过:

                        available
listing_id  available   
1944        t            364
            f            1 
2015        f            184
            t            181
3176        t            279
            f            10

这给了我类似的东西

df['Name'] = df['Name'].str.decode('utf-8').str.replace('.', '-')
df['Town'] = df['Town'].str.decode('utf-8').str.replace('.', '-')

但是我不确定如何继续工作。我如何得到想要的情节?有更好的方法进行吗?

3 个答案:

答案 0 :(得分:1)

假设您不必使用date列:

# Generate example data
N = 100
np.random.seed(1)
df = pd.DataFrame({'id': np.random.choice(list(range(1, 6)), size=N),
                   'available': np.random.choice(['t', 'f'], size=N)})
df = df.sort_values('id').reset_index(drop=True)

# For each id: get t and f counts, unstack into columns, ensure 
# column order is ['t', 'f']
counts = df.groupby(['id', 'available']).size().unstack()[['t', 'f']]

# Plot
fig, ax = plt.subplots()
counts.plot(x='t', y='f', kind='scatter', ax=ax)

# Optional: label each data point with its id. 
# This is rough and might not look good beyond a few data points
for label, (t, f) in counts.iterrows():
    ax.text(t + .05, f + .05, label)

输出:

enter image description here

答案 1 :(得分:0)

您可以按listing_idavailable进行分组,进行计数,然后拆栈,然后使用 seaborn 进行绘图。

下面我使用了一些随机数,图像仅用于说明。

import seaborn as sns

data = df.groupby(['listing_id', 'available'])['date'].count().unstack()

sns.scatterplot(x=data.t, y=data.f, hue=data.index, legend='full')

useDefaultXhrHeader

答案 2 :(得分:0)

使用数据:

enter image description here

  • 重置索引
df.reset_index(inplace=True)

   id available  count
 1944         t    364
 1944         f      1
 2015         f    184
 2015         t    181
 3176         t    279
 3176         f     10
  • 创建一个tf数据框:
t = df[df.available == 't'].reset_index(drop=True)

     id available  count
0  1944         t    364
1  2015         t    181
2  3176         t    279

f = df[df.available == 'f'].reset_index(drop=True)

     id available  count
0  1944         f      1
1  2015         f    184
2  3176         f     10

绘制数据:

plt.scatter(x=t['count'], y=f['count'])
plt.xlabel('t')
plt.ylabel('f')
for i, txt in enumerate(f['id'].tolist()):
    plt.annotate(txt, (t['count'].loc[i] + 3, f['count'].loc[i]))

enter image description here