【发布时间】:2019-12-17 14:45:49
【问题描述】:
我正在尝试将数据框中每个唯一 ID 的第一个观察值更改为 NaN。我正在使用已按唯一 ID 和时间戳排序的时间戳和坐标点的数据框。
示例:
ID timestamp latitude longitude
0 1 6/9/2017 11:20 38.795333 77.008883
1 1 6/9/2017 13:10 38.889011 77.050061
2 1 6/9/2017 16:23 40.748249 73.984191
3 2 6/11/2017 08:35 38.920602 77.222329
4 2 6/11/2017 10:00 42.366211 71.020943
5 2 6/11/2017 20:00 38.897416 77.036833
6 2 6/12/2017 07:30 38.851426 77.042298
7 2 6/12/2017 10:20 38.917346 77.222553
8 3 6/11/2017 09:01 40.782869 73.967544
9 3 6/11/2017 10:03 38.954268 77.449695
10 3 6/11/2017 11:48 38.872875 77.007763
11 3 6/12/2017 11:52 40.776931 73.876155
尝试:
df['latitude'] =\
df.groupby('ID')['latitude'].apply(lambda x: x[0].np.nan)
df['longitude'] =\
df.groupby('ID')['longitude'].apply(lambda x: x[0].np.nan)
我怀疑虽然 df 已经分组,但我仍然需要使用 groupby 来按每个唯一 ID 进行操作。我很难考虑如何访问每个第一个值,然后将它们替换为 NaN。
这给出了错误:
KeyError: 0
这是所需的输出:
ID timestamp latitude longitude
0 1 6/9/2017 11:20 NaN NaN
1 1 6/9/2017 13:10 38.889011 77.050061
2 1 6/9/2017 16:23 40.748249 73.984191
3 2 6/11/2017 08:35 NaN NaN
4 2 6/11/2017 10:00 42.366211 71.020943
5 2 6/11/2017 20:00 38.897416 77.036833
6 2 6/12/2017 07:30 38.851426 77.042298
7 2 6/12/2017 10:20 38.917346 77.222553
8 3 6/11/2017 09:01 NaN NaN
9 3 6/11/2017 10:03 38.954268 77.449695
10 3 6/11/2017 11:48 38.872875 77.007763
11 3 6/12/2017 11:52 40.776931 73.876155
编辑(为什么要这样做?):
我正在尝试改编这个版本
this answer to calculate distance and velocity。一切都很好,除了每个值的每个纬度/经度的第一个值是错误的,因为函数在行上计算,不分青红皂白的 ID。查看不同的解决方案,我怀疑我需要类似于 this... 使用 concat 和 shift 计算速度和距离。不过,这对我来说有点难以概念化-因此认为仅替换这些值会比编辑和重新运行更简单-这就是我提出这个问题的原因。
【问题讨论】:
-
你为什么要这样做?
-
您介意提供代码来构建您的数据框吗?
-
@Moormanly 如果将变量
s作为顶部文本的副本,则可以通过调用pd.read_csv(io.StringIO(s), sep=' +', engine='python')解析整个数据帧(nbsep是两个空格,然后一个加号)。 -
同意上面的cmets。可以通过使用蒙版然后使用
where生成NaN来实现这一点,但我不知道这背后的动机是什么。 -
我进行了编辑以提供更多上下文。感谢大家的帮助。
标签: python pandas numpy dataframe pandas-groupby