python绘图过滤groupby

python绘图过滤groupby,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我有一个这样的数据帧 df = pd.DataFrame({ 'comments': {0: 0, 1: 1, 2: 47, 3: 102, 4: 230}, 'content_len': {0: 4305, 1: 7344, 2: 8431, 3: 5662, 4: 3706}, 'day': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2}, 'dayofweek': {0: 2, 1: 2, 2: 2, 3: 3, 4: 3}, 'domain': {0: 'habr

我有一个这样的数据帧

df = pd.DataFrame({
 'comments': {0: 0, 1: 1, 2: 47, 3: 102, 4: 230},
 'content_len': {0: 4305, 1: 7344, 2: 8431, 3: 5662, 4: 3706},
 'day': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2},
 'dayofweek': {0: 2, 1: 2, 2: 2, 3: 3, 4: 3},
 'domain': {0: 'habrahabr.ru',
  1: 'habrahabr.ru',
  2: 'habrahabr.ru',
  3: 'habrahabr.ru',
  4: 'geektimes.ru'},
 'favs': {0: 0, 1: 1, 2: 72, 3: 36, 4: 6},
 'post_id': {0: 18284, 1: 18285, 2: 18286, 3: 18291, 4: 18294},
 'views': {0: 236, 1: 353, 2: 1200, 3: 5700, 4: 1400},
 'votes_minus': {0: 0.0, 1: 0.0, 2: 5.0, 3: 3.0, 4: 15.0},
 'votes_plus': {0: 0.0, 1: 1.0, 2: 45.0, 3: 72.0, 4: 73.0},
 'year_month': {0: datetime.strptime('2008-01-01', '%Y-%m-%d'),
  1: datetime.strptime('2008-01-01', '%Y-%m-%d'),
  2: datetime.strptime('2008-02-01', '%Y-%m-%d'),
  3: datetime.strptime('2008-02-01', '%Y-%m-%d'),
  4: datetime.strptime('2008-03-01', '%Y-%m-%d'),}})
现在我想绘制不同的图形,按“年\月”分组,每个域一个图形

例如文章的数量

df[df.domain=='habrahabr.ru'].groupby('year_month').count()[['domain']].rename(columns={'domain':'habrahabr.ru'}).join(
df[df.domain=='geektimes.ru'].groupby('year_month').count()[['domain']].rename(columns={'domain':'geektimes.ru'})).plot()
或平均内容

df[df.domain == 'habrahabr.ru'].groupby('year_month').mean()[['content_len']].rename(columns={'content_len':'habrahabr.ru'}).astype(int).join(
df[df.domain == 'geektimes.ru'].groupby('year_month').mean()[['content_len']].rename(columns={'content_len':'geektimes.ru'}).astype(int)).plot()

有比我给出的更优雅的解决方案吗?

所有领域的解决方案

我认为您可以在
groupby
函数中添加新列,然后通过以下方式重塑:

也可以通过
总和
平均值

b = df.groupby(['year_month', 'domain'])['content_len'].mean().unstack(fill_value=0)
print (b)
domain      geektimes.ru  habrahabr.ru
year_month                            
2008-01-01           0.0        5824.5
2008-02-01           0.0        7046.5
2008-03-01        3706.0           0.0

b.plot()
另一个稍微慢一点的解决方案是:

过滤域的解决方案

如果需要筛选,则仅某些域与for boolen mask一起使用,或者:



谢谢你的详细回答,谢谢你的好问题和好样品!祝你好运
b = df.groupby(['year_month', 'domain'])['content_len'].mean().unstack(fill_value=0)
print (b)
domain      geektimes.ru  habrahabr.ru
year_month                            
2008-01-01           0.0        5824.5
2008-02-01           0.0        7046.5
2008-03-01        3706.0           0.0

b.plot()
a = df.pivot_table(index='year_month', columns='domain', aggfunc='size', fill_value=0)
print (a)
domain      geektimes.ru  habrahabr.ru
year_month                            
2008-01-01             0             2
2008-02-01             0             2
2008-03-01             1             0


b = df.pivot_table(index='year_month', 
                   columns='domain', 
                   values='content_len', 
                   aggfunc='mean', 
                   fill_value=0)
print (b)
domain      geektimes.ru  habrahabr.ru
year_month                            
2008-01-01             0        5824.5
2008-02-01             0        7046.5
2008-03-01          3706           0.0
df1 = df[df['domain'].isin(['habrahabr.ru','geektimes.ru'])]
a = df1.groupby(['year_month', 'domain']).size().unstack(fill_value=0)
print (a)
domain      geektimes.ru  habrahabr.ru
year_month                            
2008-01-01             0             2
2008-02-01             0             2
2008-03-01             1             0
df1 = df.query('domain == ["habrahabr.ru", "geektimes.ru"]')
a = df1.groupby(['year_month', 'domain']).size().unstack(fill_value=0)
print (a)
domain      geektimes.ru  habrahabr.ru
year_month                            
2008-01-01             0             2
2008-02-01             0             2
2008-03-01             1             0