簡體   English   中英

熊貓數據框排序

[英]pandas data frame sort

我有一個這樣的熊貓數據框,我嘗試按列“ dist”進行排序。 排序的數據框應以E或F開頭,如下所示。 我使用的sort_values不適用於我。 該函數計算從“開始”位置到位置列表[“ C”,“ B”,“ D”,“ E”,“ A”,“ F”]的距離,然后按升序對數據框進行排序使用“ dist”列進行訂購。 有人可以告訴我為什么分類不起作用嗎?

locations = {'Start':(20,5),'A':(10,3), 'B':(5,3), 'C':(5, 7), 'D':(10,7),'E':(14,4),'F':(14,6)}

    loc_list
Out[194]: ['C', 'B', 'D', 'E', 'A', 'F']

def closest_locations(from_loc_point, to_loc_list):
    lresults=list()
    for list_index in range(len(to_loc_list)):
        dist= hypot(locations[from_loc_point[0]][0] -locations[to_loc_list[list_index]][0],locations[from_loc_point[0]][1] -locations[to_loc_list[list_index]][1]) # cumsum distante
        lista_dist = [from_loc_point[0],to_loc_list[list_index],dist]
        lresults.append(lista_dist[:])
    RESULTS = pd.DataFrame(np.array(lresults))
    RESULTS.columns = ['from','to','dist']
    RESULTS.sort_values(['dist'],ascending=[True],inplace=True)
    RESULTS.index = range(len(RESULTS))
    return RESULTS

closest_locations(['Start'], loc_list)
Out[189]: 
    from to                dist
0  Start  D   10.19803902718557
1  Start  A   10.19803902718557
2  Start  C  15.132745950421555
3  Start  B  15.132745950421555
4  Start  E    6.08276253029822
5  Start  F    6.08276253029822

最近的[two_loc_loc.dtypes輸出[247]:

from    object
to      object
dist    object
dtype: object

這是你想要的嗎?

locations = {'Start':(20,5),'A':(10,3), 'B':(5,3), 'C':(5, 7), 'D':(10,7),'E':(14,4),'F':(14,6)}
df= pd.DataFrame.from_dict(locations, orient='index').rename(columns={0:'x', 1:'y'})
df['dist'] = df.apply(lambda row: pd.np.sqrt((row['x'] - df.loc['Start', 'x'])**2 + (row['y'] - df.loc['Start', 'y'])**2), axis=1)
df.drop(['Start']).sort_values(by='dist')
    x  y       dist
E  14  4   6.082763
F  14  6   6.082763
A  10  3  10.198039
D  10  7  10.198039
C   5  7  15.132746
B   5  3  15.132746

或者如果您要將其包裝在函數中

def dist_from(df, col):
    df['dist'] = df.apply(lambda row: pd.np.sqrt((row['x'] - df.loc[col,'x'])**2 + (row['y'] - df.loc[col, 'y'])**2), axis=1)
    df['form'] = col
    df.drop([col]).sort_values(by='dist')
    df.index.name = 'to'
    return df.reset_index().loc[:, ['from', 'to', 'dist']]

您需要將“ dist”列中的值轉換為float:

df = closest_locations(['Start'], loc_list)
df.dist = list(map(lambda x: float(x), df.dist)) # convert each value to float
print(df.sort_values('dist'))                    # now it will sort properly

輸出:

    from to       dist
4  Start  E   6.082763
5  Start  F   6.082763
0  Start  D  10.198039
1  Start  A  10.198039
2  Start  C  15.132746
3  Start  B  15.132746

編輯:正如@jezrael在評論中提到的,以下是更直接的方法:

df.dist = df.dist.astype(float)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM