2014-02-15 5 views
3

У меня есть набор данных, который имеет поле категории, «Город» и 2 метрики, возраст и вес. Я хочу построить график рассеяния для каждого города, используя цикл. Однако я изо всех сил пытаюсь объединить группу и цикл, которые мне нужны, в одном заявлении. Если я просто использую цикл for, я получаю диаграмму для каждой записи, и если я делаю группу, я получаю нужное количество диаграмм, но без значений.Pandas for loop on group by

Вот мой код, используя только для цикла с моей группой по закомментирована:

import pandas as pd 
import numpy as np 
import matplotlib.pylab as plt 


d = { 'City': pd.Series(['London','New York', 'New York', 'London', 'Paris', 
         'Paris','New York', 'New York', 'London','Paris']), 
     'Age' : pd.Series([36., 42., 6., 66., 38.,18.,22.,43.,34.,54]), 
    'Weight': pd.Series([225,454,345,355,234,198,400, 256,323,310]) 
} 

df = pd.DataFrame(d) 

#for C in df.groupby('City'): 
for C in df.City: 
    fig = plt.figure(figsize=(5, 4)) 
    # Create an Axes object. 
    ax = fig.add_subplot(1,1,1) # one row, one column, first plot 
    # Plot the data. 
    ax.scatter(df.Age,df.Weight, df.City == C, color="red", marker="^") 

ответ

2

Не называйте более plt.figure, чем когда-то, как каждый вызов создает новую фигуру (грубо говоря, окно).

import pandas as pd 
import numpy as np 
import matplotlib.pylab as plt 

d = {'City': ['London', 'New York', 'New York', 'London', 'Paris', 
         'Paris', 'New York', 'New York', 'London', 'Paris'], 
    'Age': [36., 42., 6., 66., 38., 18., 22., 43., 34., 54], 
    'Weight': [225, 454, 345, 355, 234, 198, 400, 256, 323, 310]} 

df = pd.DataFrame(d) 
fig, ax = plt.subplots(figsize=(5, 4)) # 1 
df.groupby(['City']).plot(kind='scatter', x='Age', y='Weight', 
          ax=ax,   # 2 
          color=['red', 'blue', 'green']) 

plt.show() 

enter image description here

  1. plt.subplots возвращает фигуру, fig и АН осей, ax.
  2. Если вы передадите ax=ax методу Panda's plot, то все графики будут , как вверх на той же оси.

Чтобы сделать отдельную фигуру для каждого города:

import pandas as pd 
import numpy as np 
import matplotlib.pylab as plt 

d = {'City': ['London', 'New York', 'New York', 'London', 'Paris', 
         'Paris', 'New York', 'New York', 'London', 'Paris'], 
    'Age': [36., 42., 6., 66., 38., 18., 22., 43., 34., 54], 
    'Weight': [225, 454, 345, 355, 234, 198, 400, 256, 323, 310]} 

df = pd.DataFrame(d) 
groups = df.groupby(['City']) 
for city, grp in groups:       # 1 
    fig, ax = plt.subplots(figsize=(5, 4)) 
    grp.plot(kind='scatter', x='Age', y='Weight', # 2 
      ax=ax)    

    plt.show() 
  1. Это, пожалуй, все, что вы пропали без вести. Когда вы перебираете объект GroupBy, он возвращает 2-кортеж: keyby и sub-DataFrame.
  2. Используйте grp, суб-DataFrame вместо df внутри цикла.
+0

Таким образом, в некоторых случаях это было бы отличным решением, но в моем случай, когда я говорю, что мне нужен график рассеяния для каждого города, я действительно имею в виду отдельную диаграмму/цифру для каждого Города. Причина в том, что полный набор данных намного больше, поэтому мне нужно увидеть разные точки на разных графиках. – user3302483

+0

Не знаете, почему, но вышеприведенные 2 примера выкидывают ошибку: ValueError: недопустимый тип диаграммы, заданный разбросом, когда я запускаю их. Я взял группу, которую вы предложили, и вставил в мой код, чтобы я мог теперь перейти к выводу, который я искал. Было бы интересно, почему я вижу неверную ошибку типа диаграммы, хотя и с вашей структурой. Не удалось выяснить это сам. – user3302483

+0

'kind = 'scatter'' был [добавлен в Pandas v.0.13.0] (http://pandas.pydata.org/pandas-docs/version/0.13.0/whatsnew.html). – unutbu

2

Я использовал группу, с другим поста и вставить в свой код, чтобы создать диаграмму для каждой группы по:

import pandas as pd 
import numpy as np 
import matplotlib.pylab as plt 


d = { 'City': pd.Series(['London','New York', 'New York', 'London','Paris', 
         'Paris','New York', 'New York', 'London','Paris']), 
     'Age' : pd.Series([36., 42., 6., 66., 38.,18.,22.,43.,34.,54]) , 
    'Weight': pd.Series([225,454,345,355,234,198,400, 256,323,310]) 

} 

df = pd.DataFrame(d) 

groups = df.groupby(['City']) 
for city, grp in groups: 
    fig = plt.figure(figsize=(5, 4)) 
    # Create an Axes object. 
    ax = fig.add_subplot(1,1,1) # one row, one column, first plot 
    # Plot the data. 
    ax.scatter(df.Age,df.Weight, df.City == city, color="red", marker="^")