Pandas 使用子id计算列中的唯一值

Pandas 使用子id计算列中的唯一值,pandas,dataframe,unique,Pandas,Dataframe,Unique,我有一个df包含用户的子轨迹(段),旅行模式由0,1,2…指示,如下所示: df = pd.read_csv('sample.csv') df id lat lon mode 0 5138001 41.144540 -8.562926 0 1 5138001 41.144538 -8.562917 0 2 5138001 41.143689 -8.563012 0 3 5138003 43.131562 -8

我有一个
df
包含用户的子轨迹(段),旅行模式由
0,1,2…
指示,如下所示:

df = pd.read_csv('sample.csv')
df
       id     lat          lon   mode
0   5138001 41.144540   -8.562926   0
1   5138001 41.144538   -8.562917   0
2   5138001 41.143689   -8.563012   0
3   5138003 43.131562   -8.601273   1
4   5138003 43.132107   -8.598124   1
5   5145001 37.092095   -8.205070   0
6   5145001 37.092180   -8.204872   0
7   5145015 39.289341   -8.023454   2
8   5145015 39.197432   -8.532761   2
9   5145015 39.198361   -8.375641   2
在上述示例中,
id
用于段,但完整轨迹可能由不同模式覆盖(即包含多个段)。 因此,
id
的前4位是唯一的轨迹,最后3位是具有该轨迹的唯一段

我知道我可以使用以下方法计算
df
中的唯一段数:

df.groupby('id').['mode'].nunique()

然后,如何计算唯一轨迹的数量
51385145,…

使用索引获取具有
str
的前4个值,如有必要,首先通过以下方式将值转换为字符串:

如果需要处理前4个
id
s之后的值:

s = df['id'].astype(str)
df = s.str[4:].groupby(s.str[:4]).nunique().reset_index(name='count')
print (df)
     id  count
0  5138      2
1  5145      2

另一个想法是使用lambda函数:

df.groupby(df['id'].apply(lambda x: str(x)[:4]))['mode'].nunique()
df.groupby(df['id'].apply(lambda x: str(x)[:4]))['mode'].nunique()