我正在尝试按特定列对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
有人知道用于数据框的函数吗?
答案 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