添加条件计数器:基于其他列的值的计数器列

时间:2019-04-15 17:52:37

标签: python pandas

我有一张这样的桌子

kubectl get cm inpod -o jsonpath={.data}


map[application.yaml:ds:
  hosts: '-'
  keyspaces: '-'
  password: ${dpt_password}
  port: '9042'
  username: ${dpt_username}
externalresources:
  pluser:
    url: https://inpod.com/v1
jdbc:
  url: jdbc:oracle:thin:@//pxd.ord.com:1521/pxd
kafka:
  bootstrap-servers: xl-kb01.inpod.com:19093,xl-kb02.inpod.com:19093
  consumer:
    group: inpod
  schema-registry:
    endpoint: https://pxd-dev.inpod.com:8443
  security:
    protocol: SSL
  ssl:
    client-auth: need
logging:
  level:
    com:
      ab: INFO
      ba: DEBUG
    org:
      hibernate: INFO
      springframework: INFO
server:
  ssl:
    client-auth: need
    enabled: 'true'
  tomcat:
    enabled: 'true'
    file-date-format: .yyyy-MM-dd
    prefix: access_log
    rename-on-rotate: 'false'
    rotate: 'true'
    suffix: .log
endpoints_test:
  url: http://localhost:8280/inpod/rest
]

我想基于id和id2的值创建一个计数器。

例如,id是客户ID,id2是订单ID,val是订单中的商品名称。我想为客户ID和订单ID创建一个计数器。这就是为什么前两行应具有相同的计数器1

我试过了,但是他们会给我这样的东西

id    id2      val
a     red      apple
a     red      orange
b     blue     fish
c     violet   beef
a     yellow   banana
a     black    pork

我尝试过康明斯

id id2 val counter a red apple 1 a red orange 2 b blue fish 1 c violet beef 1 a yellow banana 1 a black pork 1

但这不是我想要的

我想要一个这样的结果表

df['counter'] = df.groupby(['id','id2']).cumcount() + 1

谢谢

2 个答案:

答案 0 :(得分:5)

好像您正在尝试计算cond2对的唯一值:

(id, id2)

答案 1 :(得分:3)

您可以使用groupby.transformpandas.factorize

df['counter'] = df.groupby(['id'])['id2'].transform(lambda x: pd.factorize(x)[0]).add(1)

  id     id2     val  counter
0  a     red   apple        1
1  a     red  orange        1
2  b    blue    fish        1
3  c  violet    beef        1
4  a  yellow  banana        2
5  a   black    pork        3