2016-12-07 77 views
1

我有一個數據框,其中包含以下字段。對於每個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

您可以使用groupby與應用函數的返回壓扁DataFrameSeries

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 must be a hashable type

嘗試改變SeriesDataFrame,但隨後需要unstackdroplevel

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 
+0

我的數據幀有400000條記錄。這組作品完美地爲100條記錄。對於超過100條記錄本身,我收到錯誤「TypeError:Series.name必須是可哈希類型」。不知道爲什麼我在數據框中記錄數量增加時出現此錯誤?這些限制了任何特定的大小? – user3447653

+0

我也有這個問題,解決辦法是,給我一分鐘。 – jezrael

+0

謝謝jezrael! – user3447653

0

如果這些是有序的,你可以使用firstlast功能groupby.agg

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 

如果你願意,你可以將它保存到DataFrame並刪除第一級列:

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