分组窗口功能

时间:2019-06-13 13:27:47

标签: python pandas dataframe

我正在尝试按特定列对python数据框中的项目进行分组。我需要在保持不同名称的同时获得每个ID的最小客户数。这类似于SQL窗口函数MIN()OVER(PARTITION BY)。

这是我所拥有的:

from x1 import vpn
import json

obj=vpn()

obj.check_vpn()

if(obj.flag == False):
    print("###################   VpN is not connected   ########")
with open('auth1.json') as json_file:  
    data = json.load(json_file)
    token = data["vpn_detail"]["tokens"]
    for i in range(len(token)):
        token1 = token[i]
        #print(token[i])
        print(token1)
        i = i+1   
        obj.connect_vpn(token1)

结果

ID       Name          Customers
1        Jon Smith     5
1        James Smith   3
2        David         7
3        Saul          5
3        Samuel        10
3        Paul          2

有人知道用于数据框的函数吗?

2 个答案:

答案 0 :(得分:2)

groupby()map()一起使用

import pandas as pd 

df = pd.DataFrame({'id':[1,1,2,3,3,3], 'Name':['Jon Smith','James Smith','David','Saul','Samuel','Paul'],'Customers':[5,3,7,5,10,2]})

x = df.groupby('id')['Customers'].min()
df['Customers'] = df['id'].map(x)

输出:

    id  Name       Customers
0   1   Jon Smith   3
1   1   James Smith 3
2   2   David       7
3   3   Saul        2
4   3   Samuel      2
5   3   Paul        2

答案 1 :(得分:1)

transform

您要广播原始索引的缩减。使用transform。这是执行此操作的预期方式,而且很快。

df.assign(Customers=df.groupby('ID').Customers.transform('min'))

   ID         Name  Customers
0   1    Jon Smith          3
1   1  James Smith          3
2   2        David          7
3   3         Saul          2
4   3       Samuel          2
5   3         Paul          2

我倾向于使用assign,因为它不会覆盖原始的df,您可以将其放置在新变量中或覆盖现有变量。

在覆盖数据框时无需分配即可执行此操作的等效方法:

df['Customers'] = df.groupby('ID').Customers.transform('min')

脾气暴躁

这超出了您的需求,但我想展示一种使用Numpy更快地做事的方法

i, u = pd.factorize(df.ID)
c = df.Customers.to_numpy()
o = np.empty(len(u), dtype=c.dtype)
o.fill(c.max())
np.minimum.at(o, i, c)
df.assign(Customers=o[i])

   ID         Name  Customers
0   1    Jon Smith          3
1   1  James Smith          3
2   2        David          7
3   3         Saul          2
4   3       Samuel          2
5   3         Paul          2