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
我想计算每个 SEGMENT
的 CUST_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
计数为
- A - 2
- B - 2
- C - 0
我怎样才能做到这一点?
你可以这样走:
(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
我有很多客户
CUST_ID | SEGMENT | AREA
1 | B | CAD
1 | A | RAM
2 | B | CAD
2 | C | RAM
3 | B | RAM
4 | A | RAM
我想计算每个 SEGMENT
的 CUST_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
计数为
- A - 2
- B - 2
- C - 0
我怎样才能做到这一点?
你可以这样走:
(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