Pandas DataFrame Python 中的分组依据

nhe*_*121 2 python dataframe pandas

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

我在这里找到了一个示例,解释了如何在应用组而不是系列后获取数据框。

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
Run Code Online (Sandbox Code Playgroud)

基本上,我想将相同的转换应用于我现在正在处理的巨大数据集,但我收到一条错误消息:

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
Run Code Online (Sandbox Code Playgroud)

因此,我的问题是:

  1. 我怎样才能克服这个错误?
  2. 为什么在应用带有大小的 group by 时得到的是对象类型而不是整数类型?
  3. 假设我想从df1独特的城市及其各自的位置获取数据框count(*)。我知道我可以做类似的事情

    newdf=df1.groupby(['城市']).size()

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

  1. select distinct你能给我一个 pandas 中等价的例子吗?

unu*_*tbu 5

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

groupby/transform返回一个 DataFrame,其中每列的 dtype 都与原始列的 dtype 和转换结果兼容。由于Name有 dtype 对象,

df1.groupby(['City']).transform(np.size)
Run Code Online (Sandbox Code Playgroud)

也被转换为 dtype 对象。

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


问题 1 和 3:为什么会出现ValueError: Length mismatch这种情况以及如何避免

正在分组的列中可能存在 NaN。例如,假设我们将其中一个值更改CityNaN

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

然后

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

Groupby 不对 NaN 进行分组:

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

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

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

然后将结果合并回df2

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

产量

      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
Run Code Online (Sandbox Code Playgroud)

问题 4:你的意思是Pandas 中相当于 SQLselect distinct语句的是什么?

如果是这样,也许您正在寻找 Series.unique 或者可能迭代 Groupby 对象中的键,就像在

[city for city, grp in df2.groupby(['City'])]
Run Code Online (Sandbox Code Playgroud)