Pandas 为每个唯一 ID 选择较高的值

Pandas pick the higher value for each unique id

我有很多客户

CUST_ID | SEGMENT | AREA
  1     |  B      | CAD
  1     |  A      | RAM
  2     |  B      | CAD
  2     |  C      | RAM
  3     |  B      | RAM
  4     |  A      | RAM

我想计算每个 SEGMENTCUST_ID 的唯一数量,所以我做了

df.groupby(['SEGMENT'])['CUST_ID'].nunique()

但是,如果相同的 CUST_ID 具有不同的 SEGMENT 类型,那么每个 SEGMENT 的数量就会膨胀。我想选择每个 CUST_ID 的最高值 SEGMENT 然后计数。 A最高,C最低。所以生成的 df 看起来像:

CUST_ID | SEGMENT | AREA
  1     |  A      | RAM
  2     |  B      | CAD
  3     |  B      | RAM
  4     |  A      | RAM

计数为

我怎样才能做到这一点?

你可以这样走:

(df.sort_values('SEGMENT').drop_duplicates('CUST_ID') # remove duplicates, keep only first 'CUST_ID'
   .groupby('SEGMENT')['CUST_ID'].nunique() # or just `.size()` because there are no duplicates
)

您可以尝试按 CUST_ID 列分组,然后通过获取 SEGMENT 列的 min 值来过滤行。

out = (df.groupby(['CUST_ID'])
       .apply(lambda g: g[g['SEGMENT'].eq(g['SEGMENT'].min())])
       .reset_index(drop=True))

注意:由于您想选择每个 CUST_ID 的最高值 SEGMENT 然后计数,A 是最高的,C是最小的,在ASCII表中,A是65,C是67。比较的时候,A其实比C小,所以这里用min

print(out)

   CUST_ID SEGMENT AREA
0        1       A  RAM
1        2       B  CAD
2        3       B  RAM
3        4       A  RAM
res = out.value_counts('SEGMENT')
print(res)

A    2
B    2
Name: SEGMENT, dtype: int64