在Pandas DataFrame Python中分组

时间:2015-07-10 18:53:41

标签: python pandas dataframe

我是Pandas的新手,我想知道我在下面的例子中做错了什么。

我找到了一个示例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. 为什么在使用size而不是整数类型应用group by时会获得对象类型?
  3. 我们假设我想从df1获取具有唯一城市及其各自count(*)的数据框。我知道我可以做点什么

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

  4. 不幸的是,这是一个系列,但我想要一个包含两列City和全新变量的数据框,让我们说countcity。如何通过此示例中的分组操作获取数据框?

    1. 你能给我一个大熊猫select distinct对等的例子吗?

2 个答案:

答案 0 :(得分:4)

问题2:为什么df1['size']有dtype object

groupby/transform返回带有dtype for each column which is compatible的DataFrame,其中包含原始列的dtype和转换结果。由于Name具有dtype对象,

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:您的意思是 Pandas等同于SQL select distinct语句吗?

如果是这样,也许你正在寻找 Series.unique 或者可能遍历Groupby对象中的键,如

中所做的那样
[city for city, grp in df2.groupby(['City'])]

答案 1 :(得分:1)

3。)

再次致电pd.Dataframe()

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

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

4.)我认为select distinct euqivalent只会在你的groupby中使用多个列。例如,

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

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