我怎样才能得到大熊猫' groupby命令返回DataFrame而不是Series?

时间:2017-02-19 05:43:52

标签: python pandas

我不理解大熊猫的输出。通过...分组。我开始使用DataFrame(df0),其中包含5个字段/列(zip,city,location,population,state)。

 >>> df0.info()
 <class 'pandas.core.frame.DataFrame'>
 RangeIndex: 29467 entries, 0 to 29466
 Data columns (total 5 columns):
 zip      29467 non-null object
 city     29467 non-null object
 loc      29467 non-null object
 pop      29467 non-null int64
 state    29467 non-null object
 dtypes: int64(1), object(4)
 memory usage: 1.1+ MB

我想得到每个城市的总人口,但由于有几个城市有多个邮政编码,我想我会使用groupby.sum如下:

  df6 = df0.groupby(['city','state'])['pop'].sum()

然而,这返回了一个Series而不是DataFrame:

 >>> df6.info()
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 2672, in __getattr__
     return object.__getattribute__(self, name)
  AttributeError: 'Series' object has no attribute 'info'
 >>> type(df6)
 <class 'pandas.core.series.Series'>

我希望能够用类似于

的方法查找任何城市的人口
 df0[df0['city'].isin(['ALBANY'])]

但由于我有一个系列而不是一个DataFrame,我不能。我还没有能够强制转换为DataFrame。

我现在想知道的是:

  1. 为什么我没有收到DataFrame而不是系列?
  2. 我怎样才能找到一张桌子让我查看一个城市的人口?我可以使用我从groupby获得的系列,还是应该采用不同的方法?

2 个答案:

答案 0 :(得分:5)

groupbyreset_index中需要参数as_index=False才能将MultiIndex转换为列:

df6 = df0.groupby(['city','state'], as_index=False)['pop'].sum()

或者:

df6 = df0.groupby(['city','state'])['pop'].sum().reset_index()

样品:

df0 = pd.DataFrame({'city':['a','a','b'],
                   'state':['t','t','n'],
                   'pop':[7,8,9]})

print (df0)
  city  pop state
0    a    7     t
1    a    8     t
2    b    9     n

df6 = df0.groupby(['city','state'], as_index=False)['pop'].sum()
print (df6)
  city state  pop
0    a     t   15
1    b     n    9
df6 = df0.groupby(['city','state'])['pop'].sum().reset_index()
print (df6)
  city state  pop
0    a     t   15
1    b     n    9

上次按loc选择,标量添加item()

print (df6.loc[df6.state == 't', 'pop'])
0    15
Name: pop, dtype: int64

print (df6.loc[df6.state == 't', 'pop'].item())
15

但如果只需要查找表,可以使用SeriesMultiIndex

s = df0.groupby(['city','state'])['pop'].sum()
print (s)
city  state
a     t        15
b     n         9
Name: pop, dtype: int64

#select all cities by : and state by string like 't'
#output is Series of len 1
print (s.loc[:, 't'])
city
a    15
Name: pop, dtype: int64

#if need output as scalar add item()
print (s.loc[:, 't'].item())
15

答案 1 :(得分:0)

如果没有样本数据,很难肯定地说,但是根据您显示的代码,返回一个系列,您应该能够使用df6.loc['Albany', 'NY']之类的内容访问城市的人口(即,按城市和州分类您的分组系列。)

您获得系列的原因是您选择了一个列('pop')来应用您的组计算。如果您将组计算应用于列列表,您将获得一个DataFrame你可以通过df6 = df0.groupby(['city','state'])[['pop']].sum()来做到这一点。(注意'pop'周围的额外括号,选择一列而不是一列。)但我不确定&#39} ;如果您仍然可以使用上述方法访问城市数据,则有理由这样做。