熊猫groupby,聚合和合并引发ValueError

时间:2019-12-04 13:09:40

标签: python-3.x pandas aggregate

给出该数据集:

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

2 个答案:

答案 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()是沿着索引进行连接的特殊方法),非常简单。 如果您很难实现这一点,我可以举个例子。