我有一个包含以下字段的数据框。对于每个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
答案 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