首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用子id计算列中的唯一值

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

Stack Overflow用户
提问于 2021-03-12 12:23:48
回答 1查看 22关注 0票数 0

我有一个包含用户子轨迹(段)的df0,1,2...指示的旅行方式如下:

代码语言:javascript
运行
复制
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中的唯一段数:

代码语言:javascript
运行
复制
df.groupby('id').['mode'].nunique()

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-12 12:24:56

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

代码语言:javascript
运行
复制
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

如果需要在前4个ids之后处理值:

代码语言:javascript
运行
复制
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函数:

代码语言:javascript
运行
复制
df.groupby(df['id'].apply(lambda x: str(x)[:4]))['mode'].nunique()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66599881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档