按pandas数据框中的字段分组

时间:2016-12-07 14:21:12

标签: 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.32       333.11

结果:

Id  StartLat    StartLong   DestLat DestLong
101 53.51       118.12      33.32       333.11

2 个答案:

答案 0 :(得分:0)

您可以groupby使用应用函数将返回展平DataFrame改为Series

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必须是可哈希类型

尝试将Series更改为DataFrame,但随后unstack需要droplevel

df = df.groupby('Id')['Latitude','Longitude']
       .apply(lambda x: pd.DataFrame(x.values.ravel()))
       .unstack()
df.columns = df.columns.droplevel(0)
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

答案 1 :(得分:0)

如果订购了这些,您可以使用first的{​​{1}}和last函数:

groupby.agg

如果需要,可以将其保存到DataFrame并删除列的第一级:

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