Python 数据帧中的按字段分组

Python 数据帧中的按字段分组,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含以下字段的数据框。对于每个Id,我有两条记录,它们代表不同的纬度和经度。我试图实现一个结果数据帧,它根据当前数据帧根据id进行分组,并将其纬度和经度放入不同的字段中 我尝试了按功能分组,但没有得到预期的结果。任何帮助都将不胜感激 Id StartTime StopTime Latitude Longitude 101 14:42:28 14:47:56 53.51 118.12 101 22:10:01 22:12:49 33.3

我有一个包含以下字段的数据框。对于每个Id,我有两条记录,它们代表不同的纬度和经度。我试图实现一个结果数据帧,它根据当前数据帧根据id进行分组,并将其纬度和经度放入不同的字段中

我尝试了按功能分组,但没有得到预期的结果。任何帮助都将不胜感激

Id  StartTime   StopTime    Latitude    Longitude
101 14:42:28    14:47:56    53.51       118.12
101 22:10:01    22:12:49    33.32       333.11
结果:

Id  StartLat    StartLong   DestLat DestLong
101 53.51       118.12      33.32       333.11
您可以使用with apply函数将展平数据帧返回到系列:

df = df.groupby('Id')['Latitude','Longitude'].apply(lambda x: pd.Series(x.values.ravel()))
df.columns = ['StartLat', 'StartLong', 'DestLat', 'DestLong']
df = df.reset_index()
print (df)
    Id  StartLat  StartLong  DestLat  DestLong
0  101     53.51     118.12    33.32    333.11
如果出现问题:

TypeError:Series.name必须是可哈希类型

尝试将
系列
更改为
数据帧
,但需要:


如果订购了这些功能,您可以对
groupby.agg
使用
first
last
功能:

df.groupby('Id').agg({'Latitude': {'StartLat': 'first', 'DestLat': 'last'}, 
                      'Longitude': {'StartLong': 'first', 'DestLong': 'last'}})

    Latitude         Longitude         
    StartLat DestLat StartLong DestLong
Id                                     
101    53.51   33.32    118.12   333.11
如果需要,可以将其保存到数据帧并删除第一级列:

res = df.groupby('Id').agg({'Latitude': {'StartLat': 'first', 'DestLat': 'last'}, 
                            'Longitude': {'StartLong': 'first', 
                                          'DestLong': 'last'}})

res.columns = res.columns.droplevel(0)
res
Out: 
     StartLat  DestLat  StartLong  DestLong
Id                                         
101     53.51    33.32     118.12    333.11

我的数据帧有400000条记录。这个组员可以完美地录制100张唱片。对于超过100条记录本身,我得到错误“TypeError:Series.name必须是可哈希类型”。不确定为什么在数据帧中记录数增加时出现此错误?这些是否受到任何特定尺寸的限制?我也有这个问题,解决方法是,给我一分钟。
res = df.groupby('Id').agg({'Latitude': {'StartLat': 'first', 'DestLat': 'last'}, 
                            'Longitude': {'StartLong': 'first', 
                                          'DestLong': 'last'}})

res.columns = res.columns.droplevel(0)
res
Out: 
     StartLat  DestLat  StartLong  DestLong
Id                                         
101     53.51    33.32     118.12    333.11