Pandas DataFrame Python中的分组依据

2024-06-23 18:48:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我发现了一个例子here解释了如何在应用groupby而不是series之后获取数据帧。在

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

基本上,我想将同样的转换应用到我现在正在处理的一个巨大的数据集,但是我得到了一个错误消息:

^{pr2}$

因此,我的问题是:

  1. 我怎样才能克服这个错误?在
  2. 当应用group by with size而不是integer类型时,为什么要获取对象类型?在
  3. 假设我想从df1获得一个数据帧,其中包含唯一的城市及其各自的{}。我知道我可以做一些事情

    newdf=df1.groupby(['City']).size()

不幸的是,这是一个系列,但是我想要一个包含两列的数据帧,City和一个全新的变量,比如{}。我怎样才能从像这个例子中那样的groupby操作中获取数据帧?在

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

Tags: 数据ancitysizenptransforminteger例子
2条回答

问题2:为什么df1['size']object的数据类型?

groupby/transform返回一个带有dtype for each column which is compatible的数据帧,其中包含原始列的数据类型和转换结果。由于Name有dtype对象

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

也转换为dtype对象。在

我不知道为什么transform是这样编码的;可能有一些用例要求这样做以确保某种意义上的正确性。在


问题1&3:为什么我得到ValueError: Length mismatch以及如何避免它

在被分组的列中可能有nan。例如,假设我们将City中的一个值更改为NaN

^{pr2}$

那么

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等价的SQLselect distinct语句?

如果是这样的话,也许你正在寻找 Series.unique 或者可能迭代Groupby对象中的键,如中所述

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

3.)

只需再次致电pd.Dataframe()

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

或者

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

4.)我认为select distincteuqivalent只会在groupby中使用多个列。例如

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

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

相关问题 更多 >

    热门问题