Python Pandas:如何分组并为组中的所有项目分配 id?
Posted
技术标签:
【中文标题】Python Pandas:如何分组并为组中的所有项目分配 id?【英文标题】:Python Pandas: How can I group by and assign an id to all the items in a group? 【发布时间】:2016-07-03 23:03:08 【问题描述】:我有 df:
domain orgid
csyunshu.com 108299
dshu.com 108299
bbbdshu.com 108299
cwakwakmrg.com 121303
ckonkatsunet.com 121303
我想添加一个新列,用每个 orgid 的数字 id 替换域列:
domain orgid domainid
csyunshu.com 108299 1
dshu.com 108299 2
bbbdshu.com 108299 3
cwakwakmrg.com 121303 1
ckonkatsunet.com 121303 2
我已经尝试过这条线,但它没有给出我想要的结果:
df.groupby('orgid').count['domain'].reset_index()
有人可以帮忙吗?
【问题讨论】:
“未来”在此处重复:***.com/questions/41594703/… 【参考方案1】:您可以在groupby
对象上调用rank
并传递参数method='first'
:
In [61]:
df['domainId'] = df.groupby('orgid')['orgid'].rank(method='first')
df
Out[61]:
domain orgid domainId
0 csyunshu.com 108299 1
1 dshu.com 108299 2
2 bbbdshu.com 108299 3
3 cwakwakmrg.com 121303 1
4 ckonkatsunet.com 121303 2
如果您想覆盖该列,您可以这样做:
df['domain'] = df.groupby('orgid')['orgid'].rank(method='first')
【讨论】:
你真的需要lambda
吗? rank
不是 SeriesGroupBy 对象的方法吗?
@DSM 好点,没必要因为我刚刚测试过所以已经删除了【参考方案2】:
您可以使用 sklearn.preprocessing 中的 LabelEncoder,例如:
df["domain"] = LabelEncoder().fit_transform(df.domain)
【讨论】:
【参考方案3】:dplyr
非常直观
df %>% group_by(orgid) %>% mutate(domainid=row_number())
我正在将其移植到 python,datar
:
from datar.all import *
df = tibble(
domain=['csyunshu.com', 'dshu.com', 'bbbdshu.com', 'cwakwakmrg.com', 'ckonkatsunet.com'],
orgid=[108299,108299,108299,121303,121303]
)
df >> group_by(f.orgid) >> mutate(domainid=row_number())
# <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7ff728cba490>
df >> group_by(f.orgid) >> mutate(domainid=row_number()) >> showme()
[2021-03-13 00:55:12][datar][ INFO] # [DataFrameGroupBy] Groups: ['orgid'] (2)
# domain orgid domainid
# 0 csyunshu.com 108299 0
# 1 dshu.com 108299 1
# 2 bbbdshu.com 108299 2
# 3 cwakwakmrg.com 121303 0
# 4 ckonkatsunet.com 121303 1
df >> group_by(f.orgid) >> mutate(domainid=row_number()+1) >> showme()
[2021-03-13 00:55:26][datar][ INFO] # [DataFrameGroupBy] Groups: ['orgid'] (2)
# domain orgid domainid
# 0 csyunshu.com 108299 1
# 1 dshu.com 108299 2
# 2 bbbdshu.com 108299 3
# 3 cwakwakmrg.com 121303 1
# 4 ckonkatsunet.com 121303 2
【讨论】:
以上是关于Python Pandas:如何分组并为组中的所有项目分配 id?的主要内容,如果未能解决你的问题,请参考以下文章
C# LINQ NET 3.5 SP1:使用 LINQ 按两个字段分组,并为组的所有成员分配一个相关的唯一 ID(整数)
如何使用没有临时表的 SQL 查询为组中的每个元素添加序列号