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(整数)

Pandas:按两列分组,将第一列组中的第一个值相加

Plotly:如何使用 go.Bar 为组指定颜色?

如何使用没有临时表的 SQL 查询为组中的每个元素添加序列号

如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?

到目前为止,按同一组中的聚合元素分组 - Pandas