首页 > 解决方案 > 使用子 ID 计算列中的唯一值

问题描述

我有一个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是针对分段,但完整的轨迹可能被不同的模式覆盖(即包含多个分段)。所以前 4 位id是唯一的轨迹,最后 3 位是具有该轨迹的唯一段。

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

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

然后我如何计算唯一轨迹的数量5138, 5145, ...

标签: pandasdataframeunique

解决方案


使用索引获取前 4 个值str,如有必要,首先通过 将值转换为字符串Series.astype

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

如果需要在前 4id秒后处理值:

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()

推荐阅读