我有一个类似于以下数据框:
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('.', '-')
但是我不确定如何继续工作。我如何得到想要的情节?有更好的方法进行吗?
答案 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)
输出:
答案 1 :(得分:0)
您可以按listing_id
和available
进行分组,进行计数,然后拆栈,然后使用 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')
答案 2 :(得分:0)
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
t
和f
数据框: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]))