Групповой предмет и график рассеяния? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть кадр данных, аналогичный приведенному ниже:

    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 вхождений, а значение y - количество f вхождений в столбце 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

Но я не уверен, как это работать больше.Как я могу получить желаемый сюжет?Есть ли лучший способ продолжить?

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

Предполагается, что вам не нужно использовать столбец 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

0 голосов
/ 26 сентября 2019

Используя ваши данные:

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
  • создать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]))

enter image description here

0 голосов
/ 26 сентября 2019

Вы можете сгруппировать по 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')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...