【问题标题】:How to assign a group number to each ID (n=1,2,3.....)?如何为每个 ID 分配一个组号(n=1,2,3.....)?
【发布时间】:2022-01-23 22:38:56
【问题描述】:

我想为每个组分配一个编号。我试着做

df['group_n'] = df.groupby('ID').ngroup()

但它给了我一个错误消息:

SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置值。 尝试改用 .loc[row_indexer,col_indexer] = value 请参阅文档中的注意事项:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

如果我这样做,df['group_n'] = df.groupby('ID').ngroup().add(1)

我按降序得到 _n(意思是 C:3、B:2、A:1)有没有办法保留该顺序但 group_n 从 0 开始?

我的当前表:

ID   date   sender   
C    Jan20     3         
C    Feb20     7         
C    Mar20     12        
C    Apr20     15        
B    Mar20     1         
B    May20     10        
B    Jun20     15        
...
A    Jan21     10        
A    Feb21     12        
A    Mar21     20     
A    Apr21     5  

想要的表:

ID   date   sender   group_n
C    Jan20     3         1
C    Feb20     7         1
C    Mar20     12        1
C    Apr20     15        1
B    Mar20     1         2
B    May20     10        2
B    Jun20     15        2
A    Jan21     10        3
A    Feb21     12        3
A    Mar21     20        3
A    Apr21     5         3

提前谢谢你!

【问题讨论】:

  • group_n是否对应ID?

标签: python pandas


【解决方案1】:

用途:

df['group_n'] = pd.factorize(df['ID'])[0] + 1

或者:

df['group_n'] = df.gruopby('ID', sort=False).ngroup().add(1)

print(df)

ID   date   sender   group_n
A    Jan20     3         1
A    Feb20     7         1
A    Mar20     12        1
A    Apr20     15        1
B    Mar20     1         2
B    May20     10        2
B    Jun20     15        2
C    Jan21     10        3
C    Feb21     12        3
C    Mar21     20        3
C    Apr21     5         3

【讨论】:

  • 由于我的 ID 的排序方式,我遇到了 group_n 降序排列的问题(请参阅 OP),是否存在反向 _ngrouping 之类的东西?
  • 你可以在 groupby groupby('ID', sort=False) 上传递 sort=False 或使用 pd.factorize()
  • 我完全按照描述做了:df['empMgrKey'] = df.groupby(['empId', 'mgrId']), sort=False).ngroup().add(1) 但是我仍然收到 SettingWithCopyWarning 消息。知道如何在不使用 factorize() 的情况下摆脱这个警告吗?谢谢!
  • df.loc[:, 'empMgrKey']? df 是其他数据帧的一部分吗? @sikander,见stackoverflow.com/questions/20625582/…
  • @ansev 我尝试了 df.loc[:, 'empMgrKey'] 并得到了同样的警告。我将很快通过 SO 线程,但要回答您关于切片的问题,这是 ngroup() 之前的行: df = df0.loc[df0['endDate'] >= pd.to_datetime('2020-01-01 ')]
猜你喜欢
  • 2021-05-06
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2016-10-19
  • 2021-06-16
  • 1970-01-01
相关资源
最近更新 更多