如何在熊猫分组后压缩行

时间:2019-02-20 13:26:41

标签: python pandas

我已对数据框执行了分组。

grouped = data_df.groupby(['Cluster','Visit Number Final'])['Visitor_ID'].count() 

我得到以下输出:

data_df.groupby(['Cluster','Visit Number Final'])['Visitor_ID'].count()

出[81]:

    Cluster  Visit Number Final
    0        1                     21846
             2                      1485
             3                       299
             4                        95
             5                        24
             6                         8
             7                         3
    1        1                     33600
             2                      2283
             3                       404
             4                       117
             5                        34
             6                         7
    2        1                      5858
             2                       311
             3                        55
             4                        14
             5                         6
             6                         3
             7                         1
    3        1                     19699
             2                      1101
             3                       214
             4                        78
             5                        14
             6                         8
             7                         3
    4        1                     10086
             2                       344
             3                        59
             4                        14
             5                         3
             6                         1
    Name: Visitor_ID, dtype: int64                               

现在,我想压缩其最终访问人数> 3的行(添加具有最终访问人数的最终4,5,6之和的新行)。我正在尝试groupby.filter但没有得到预期的输出。 我的最终输出应类似于

Cluster  Visit Number Final 

    0        1                     21846 
             2                      1485 
             3                       299 
           >=4                       130 

    1        1                     33600 
             2                      2283 
             3                       404 
           >=4                       158 

    2        1                      5858 
             2                       311 
             3                        55 
           >=4                        24 

    3        1                     19699 
             2                      1101 
             3                       214 
           >=4                       103 

    4        1                     10086 
             2                       344 
             3                        59 
           >=4                        18

2 个答案:

答案 0 :(得分:2)

最简单的方法是在对数据框进行分组之前,替换大于3的“最终访问人数”值:

df.loc[df['Visit Number Final'] > 3, 'Visit Number Final'] = '>=4'
df.groupby(['Cluster','Visit Number Final'])['Visitor_ID'].count()

答案 1 :(得分:1)

尝试一下:

visit_val = df.index.get_level_values(1)
grp = np.where((visit_val <= 3) == 0, '>=4', visit_val)

(df.groupby(['Cluster',grp])['Number Final'].sum()
   .reset_index().rename(columns={'level_1':'Visit'}))

输出:

    Cluster Visit  Number Final
0         0     1         21846
1         0     2          1485
2         0     3           299
3         0   >=4           130
4         1     1         33600
5         1     2          2283
6         1     3           404
7         1   >=4           158
8         2     1          5858
9         2     2           311
10        2     3            55
11        2   >=4            24
12        3     1         19699
13        3     2          1101
14        3     3           214
15        3   >=4           103
16        4     1         10086
17        4     2           344
18        4     3            59
19        4   >=4            18

或获取带有索引的数据框:

(df.groupby(['Cluster',grp])['Number Final'].sum()
   .rename_axis(['Cluster','Visit']).to_frame())

输出:

               Number Final
Cluster Visit              
0       1             21846
        2              1485
        3               299
        >=4             130
1       1             33600
        2              2283
        3               404
        >=4             158
2       1              5858
        2               311
        3                55
        >=4              24
3       1             19699
        2              1101
        3               214
        >=4             103
4       1             10086
        2               344
        3                59
        >=4              18