给出该数据集:
id timestamp lng lat
V1 123 100 30
V1 124 100 31
V1 125 101 29
V2 126 102 30
V2 127 105 31
我想按“ id”分组并获取第一个和最后一个“时间戳”,并将它们称为“ start_time”和“ stop_time”。我希望将“ lng”和“ lat”与每个组中的第一个和最后一个“时间戳”相关联。最后,我希望与一个组关联的所有lng和lat作为列表或字典(以timestamp为键)。因此,结果可能类似于:
start_time stop_time start_lng start_lat end_lng end_lat path_lng path_lat
V1 123 125 100 30 101 29 [100,100,101] [30,31,29]
V2 126 127 102 30 105 31 [102,105] [30,31]
我可以获取“ start_time”和“ stop_time”。我认为获取每个“ lng”和“ lat”的最佳方法是与原始数据帧合并两次。但是,我不断收到“ ValueError:您正在尝试在int64和对象列上进行合并。如果希望继续,则应使用pd.concat”,并且无法弄清楚它所指的是哪一列。对于最后一步,我认为应用lambda函数构建字典或列表可能行得通,但是我还没走那么远。这是我的代码:
col0 = ["V1","V1","V1","V2","V2"]
col1 = [123,124,125,126,127]
col2 = [100,100,101,102,105]
col3 = [30,31,29,30,31]
df = pd.DataFrame({"timestamp":col1,"fixed_lng":col2,"fixed_lat":col3},index=[col0])
df.index.name = "id"
summary = df.groupby(df.index.values).agg(
start_timestamp=pd.NamedAgg(column='timestamp', aggfunc='min'),
stop_timestamp=pd.NamedAgg(column='timestamp', aggfunc='max')
)
merged = summary.merge(df,left_index=True, right_index=True, left_on=["start_timestamp"], right_on=["timestamp"])
我正在Windows 10上通过Anaconda3 64bit使用Python 3.7.4和Pandas 0.25.1
答案 0 :(得分:1)
如果已订购数据帧中的时间戳记,请使用:
df.groupby(level=0).agg(start_timestamp=('timestamp', 'min'),
stop_timestamp=('timestamp', 'max'),
start_long=('fixed_lng', 'first'),
start_lat=('fixed_lat','first'),
end_long=('fixed_lng', 'last'),
end_lat=('fixed_lat', 'last'),
path_lng=('fixed_lng', list),
path_lat=('fixed_lat', list))
输出:
start_timestamp stop_timestamp start_long start_lat end_long end_lat path_lng path_lat
V1 123 125 100 30 101 29 [100, 100, 101] [30, 31, 29]
V2 126 127 102 30 105 31 [102, 105] [30, 31
您输入的df是:
col0 = ["V1","V1","V1","V2","V2"]
col1 = [123,124,125,126,127]
col2 = [100,100,101,102,105]
col3 = [30,31,29,30,31]
df = pd.DataFrame({"timestamp":col1,"fixed_lng":col2,"fixed_lat":col3},index=col0)
df.index.name = "id"
答案 1 :(得分:0)
使用.first()和.last()制作两个分组表,然后按索引合并它们(使用.join()是沿着索引进行连接的特殊方法),非常简单。 如果您很难实现这一点,我可以举个例子。