2015-07-10 157 views
2

我是熊猫新手,我想知道我在做什么错在下面的例子中。group by Pandas DataFrame Python

我找到一个例子here解释了如何在应用一个组而不是一个系列之后获得数据帧。

df1 = pd.DataFrame({ 
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] , 
"City" : ["Seattle", "Seattle", "Baires", "Caracas", "Baires", "Caracas"] }) 

df1['size'] = df1.groupby(['City']).transform(np.size) 

df1.dtypes #Why is size an object? shouldn't it be an integer? 

df1[['size']] = df1[['size']].astype(int) #convert to integer 

df1['avera'] = df1.groupby(['City'])['size'].transform(np.mean) #group by again 

基本上,我想申请相同的变换到一个巨大的数据集,现在我的工作,但我得到一个错误信息:

budgetbid['meanpb']=budgetbid.groupby(['jobid'])['probudget'].transform(np.mean) #can't upload this data for the sake of explanation 

ValueError: Length mismatch: Expected axis has 5564 elements, new values have 78421 elements 

因此,我的问题是:

  1. 我该如何克服这个错误?
  2. 为什么在应用group by而不是整数类型时会得到一个对象类型?
  3. 让我们说我想从df1获得一个数据框与独特的城市和他们各自的count(*)。我知道我可以做这样的事情

    newdf = df1.groupby([“市”])。大小()

不幸的是,这是一个系列的,但我想有两列数据帧,City和全新变量,比如说countcity。如何从像本例中的分组操作那样获取数据框?

  1. 你能给我举一个select distinct在熊猫的例子吗?

回答

3

问题2:为什么df1['size']具有D型object

groupby/transform返回与原列的D型和变换的结果既是dtype for each column which is compatible一个数据帧。由于Name具有D型对象,

df1.groupby(['City']).transform(np.size) 

转换为DTYPE对象为好。

我不确定为什么transform编码是这样工作的;可能会有一些用例需要这样来确保某种意义上的正确性。


问题1 & 3:为什么我得到ValueError: Length mismatch,我怎么能避免它

有可能NaN的列被分组。例如,假设我们改变City值之一NaN

df2 = pd.DataFrame({ 
    "Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] , 
    "City" : [np.nan, "Seattle", "Baires", "Caracas", "Baires", "Caracas"] }) 
grouped = df2.groupby(['City']) 

然后

In [86]: df2.groupby(['City']).transform(np.size) 
ValueError: Length mismatch: Expected axis has 5 elements, new values have 6 elements 

GROUPBY不群的NaN:

In [88]: [city for city, grp in df2.groupby(['City'])] 
Out[88]: ['Baires', 'Caracas', 'Seattle'] 

要解决此问题,使用groupby/agg

countcity = grouped.agg('count').rename(columns={'Name':'countcity'}) 
#   countcity 
# City    
# Baires   2 
# Caracas   2 
# Seattle   1 

然后将结果合并回df2

result = pd.merge(df2, countcity, left_on=['City'], right_index=True, how='outer') 
print(result) 

产生

 City  Name countcity 
0  NaN Alice  NaN 
1 Seattle  Bob   1 
2 Baires Mallory   2 
4 Baires  Bob   2 
3 Caracas Mallory   2 
5 Caracas Mallory   2 

问题4:你的意思是什么是熊猫相当于SQL语句select distinct的?

如果是这样,也许你正在寻找 Series.unique 或者是通过在GROUPBY对象键循环,如在

[city for city, grp in df2.groupby(['City'])] 
1

3)

再打电话pd.Dataframe()

newdf = pd.Dataframe(df1.City.value_counts())

newdf = pd.Dataframe(groupby(['City']).size())

4)我觉得select distinct euqivalent也只是使用更多比你的一列还要多 通过...分组。因此,例如,

df1.groupby(['City', 'Name']).size()将返回GROUPBY对象:

City  Name 
Baires Bob  1 
     Mallory 1 
Caracas Mallory 2 
Seattle Alice  1 
     Bob  1 
dtype: int64 
+0

对于3做的,我会加入'newdf = newdf补充它.reset_index('City')'然后'newdf.columns = ['City','countcity']' – Nestorghh