【问题标题】:group by in Pandas DataFrame Python在 Pandas DataFrame Python 中分组
【发布时间】:2015-09-29 15:29:19
【问题描述】:

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

我找到了一个示例 here,它解释了如何在应用 group by 而不是 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

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

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 with size 而不是整数类型时得到对象类型?
  3. 假设我想从df1 获取一个数据框,其中包含独特的城市及其各自的count(*)。我知道我可以做类似的事情

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

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

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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
    

    【讨论】:

    • 对于 3,我将通过添加 newdf=newdf.reset_index('City') 然后 newdf.columns=['City','countcity'] 来补充它
    【解决方案2】:

    问题 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'])]
    

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 2012-10-21
      • 2016-02-28
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      相关资源
      最近更新 更多