【问题标题】:Python Pandas: How can I group by and assign an id to all the items in a group?Python Pandas:如何分组并为组中的所有项目分配 id?
【发布时间】: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()

有人可以帮忙吗?

【问题讨论】:

标签: python pandas indexing group-by


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2019-11-20
      相关资源
      最近更新 更多