在Pandas中,分组列之后的组已经消失

时间:2017-01-15 06:33:20

标签: python pandas

我有以下名为ttm的数据框:

    usersidid   clienthostid    eventSumTotal   LoginDaysSum    score
0       12          1               60              3           1728
1       11          1               240             3           1331
3       5           1               5               3           125
4       6           1               16              2           216
2       10          3               270             3           1000
5       8           3               18              2           512

当我做的时候

ttm.groupby(['clienthostid'], as_index=False, sort=False)['LoginDaysSum'].count()

我得到了我的预期(虽然我希望结果在一个名为'ratio'的新标签下):

       clienthostid  LoginDaysSum
0             1          4
1             3          2

但是当我做的时候

ttm.groupby(['clienthostid'], as_index=False, sort=False)['LoginDaysSum'].apply(lambda x: x.iloc[0] / x.iloc[1])

我明白了:

0    1.0
1    1.5
  1. 标签为什么会这样?我还需要分组需要'clienthostid',我也需要申请的结果也在标签下
  2. 有时当我进行分组时,其他一些列仍会出现,为什么有时列会消失并且有时会停留?是不是有一个我不想做那些东西的旗帜?
  3. 在我给出的示例中,当我计算标签'LoginDaysSum'上显示的结果时,是否有为什么要为结果添加新标签?
  4. 谢谢,

4 个答案:

答案 0 :(得分:7)

DataFrame之后返回groupby是两种可能的解决方案:

  1. 参数as_index=False适用于countsummean函数

  2. reset_index用于从index级别创建新列,更一般的解决方案

  3. df = ttm.groupby(['clienthostid'], as_index=False, sort=False)['LoginDaysSum'].count()
    print (df)
       clienthostid  LoginDaysSum
    0             1             4
    1             3             2
    
    df = ttm.groupby(['clienthostid'], sort=False)['LoginDaysSum'].count().reset_index()
    print (df)
       clienthostid  LoginDaysSum
    0             1             4
    1             3             2
    

    第二次需要删除as_index=False,而是添加reset_index

    #output is `Series`
    a = ttm.groupby(['clienthostid'], sort=False)['LoginDaysSum'] \
             .apply(lambda x: x.iloc[0] / x.iloc[1])
    print (a)
    clienthostid
    1    1.0
    3    1.5
    Name: LoginDaysSum, dtype: float64
    
    print (type(a))
    <class 'pandas.core.series.Series'>
    
    print (a.index)
    Int64Index([1, 3], dtype='int64', name='clienthostid')
    
    
    df1 = ttm.groupby(['clienthostid'], sort=False)['LoginDaysSum']
             .apply(lambda x: x.iloc[0] / x.iloc[1]).reset_index(name='ratio')
    print (df1)
       clienthostid  ratio
    0             1    1.0
    1             3    1.5
    

    为什么有些专栏不见了?

    我认为可能存在问题automatic exclusion of nuisance columns

    #convert column to str
    ttm.usersidid = ttm.usersidid.astype(str) + 'aa'
    print (ttm)
      usersidid  clienthostid  eventSumTotal  LoginDaysSum  score
    0      12aa             1             60             3   1728
    1      11aa             1            240             3   1331
    3       5aa             1              5             3    125
    4       6aa             1             16             2    216
    2      10aa             3            270             3   1000
    5       8aa             3             18             2    512
    
    #removed str column userid
    a = ttm.groupby(['clienthostid'], sort=False).sum()
    print (a)
                  eventSumTotal  LoginDaysSum  score
    clienthostid                                    
    1                       321            11   3400
    3                       288             5   1512
    

    What is the difference between size and count in pandas?

答案 1 :(得分:3)

countgroupby对象的内置方法,pandas知道如何处理它。指定了另外两个用于确定输出内容的内容。

#                         For a built in method, when
#                         you don't want the group column
#                         as the index, pandas keeps it in
#                         as a column.
#                             |----||||----|
ttm.groupby(['clienthostid'], as_index=False, sort=False)['LoginDaysSum'].count()

   clienthostid  LoginDaysSum
0             1             4
1             3             2
#                         For a built in method, when
#                         you do want the group column
#                         as the index, then...
#                             |----||||---|
ttm.groupby(['clienthostid'], as_index=True, sort=False)['LoginDaysSum'].count()
#                                                       |-----||||-----|
#                                                 the single brackets tells
#                                                 pandas to operate on a series
#                                                 in this case, count the series

clienthostid
1    4
3    2
Name: LoginDaysSum, dtype: int64
ttm.groupby(['clienthostid'], as_index=True, sort=False)[['LoginDaysSum']].count()
#                                                       |------||||------|
#                                             the double brackets tells pandas
#                                                to operate on the dataframe
#                                              specified by these columns and will
#                                                return a dataframe

              LoginDaysSum
clienthostid              
1                        4
3                        2

当您使用apply pandas时,当您说as_index=False时,不再知道如何处理群组列。它必须相信,如果你使用apply,你想要返回你所说的返回,所以它只会扔掉它。此外,您的列周围有单个括号,表示可以在一个系列上操作。而是使用as_index=True将分组列信息保留在索引中。然后使用reset_index进行跟进,将其从索引转移回数据帧。此时,使用单个括号并不重要,因为在reset_index之后,您将再次拥有数据框。

ttm.groupby(['clienthostid'], as_index=True, sort=False)['LoginDaysSum'].apply(lambda x: x.iloc[0] / x.iloc[1])

0    1.0
1    1.5
dtype: float64
ttm.groupby(['clienthostid'], as_index=True, sort=False)['LoginDaysSum'].apply(lambda x: x.iloc[0] / x.iloc[1]).reset_index()

   clienthostid  LoginDaysSum
0             1           1.0
1             3           1.5

答案 2 :(得分:1)

读取groupy documentarion时,发现groupby之后自动排除列通常是由于排除的列中存在空值造成的。

尝试用一些值填充“ null”。

赞:

df.fillna('')

答案 3 :(得分:1)

您只需要此即可:

ttm.groupby(['clienthostid'], as_index=False, sort=False)[['LoginDaysSum']].apply(lambda x: x.iloc[0] / x.iloc[1]).reset_index()

[[]]会将输出转换为pd.Dataframe而不是pd.Series。