如何为Pandas DataFrame添加行程记录数列并过滤短行程?
解决Pandas按TripID添加行程长度并过滤的问题
嘿,这个问题我之前也碰到过,其实Pandas里有两个超好用的方法能直接解决你的需求,不管是给每行匹配对应TripID的记录数,还是后续过滤行程,都能轻松搞定!
第一步:给每行添加对应TripID的记录数
你已经通过lengths = df['TripID'].value_counts()拿到了每个行程的记录数,现在只需要把这些值映射回原DataFrame的对应行就行,这里有两种简单的实现方式:
方法1:使用map()方法
map()会自动根据TripID的值,从lengths里找到对应的记录数并填充到新列,完全不用手动匹配:
# 你已经拿到的行程记录数 lengths = df['TripID'].value_counts() # 添加length列 df['length'] = df['TripID'].map(lengths)
方法2:使用groupby() + transform()方法
如果不想单独生成lengths变量,也可以直接通过分组计算,transform()会把每组的计算结果广播到组内的每一行,一步到位:
df['length'] = df.groupby('TripID')['TripID'].transform('count')
这两种方法都会得到你期望的输出:
TripID Lat Lon time length 0 42 53.55 9.99 74 3 1 42 53.58 9.99 78 3 3 42 53.60 9.98 79 3 6 12 52.01 10.04 64 2 7 12 52.34 10.05 69 2
第二步:过滤记录数少于最小值的行程
有了length列之后,过滤就非常简单了,直接用布尔索引筛选符合条件的行即可。比如你要保留记录数≥2的行程:
# 设置最小记录数 min_trip_length = 2 # 过滤 filtered_df = df[df['length'] >= min_trip_length]
如果你的最小记录数是3,那只会保留TripID为42的行程,完全满足你的需求。
为什么之前匹配不上?
估计你之前尝试了直接赋值或者其他方式,但没有按TripID做对应映射。而map()和transform()都是基于TripID的键值自动匹配的,所以不会出现行不对应的问题。
内容的提问来源于stack exchange,提问作者Jan Kaiser
相关产品推荐
相关产品推荐

