2017-06-21 70 views
2

你好,我有下面的數據框,我試圖計算每個城市(行)的絕對變化並打印具有最大價值的城市的城市名稱。我能夠獲得絕對的改變,但不能獲得城市名稱,我只能獲得索引值。有沒有一種方法可以獲得城市名稱而不是索引值。在下面的例子中,我獲得了索引值3而不是「達拉斯」。Python Pandas獲取行位置名稱而不是索引值

df = pd.DataFrame({'City': ['Chicago', 'Atlanta', 'New York', 'Dallas'], 
        'col1': [10, 15, 80, 200], 
        'col2': [45, 75, 90, 5], 
        'col3': [25, 35, 60, 420], 
        'col4': [60, 105, 325, 55]}) 

輸出:

 City col1 col2 col3 col4 
0 Chicago 10 45 25 60 
1 Atlanta 15 75 35 105 
2 New York 80 90 60 325 
3 Dallas 200  5 420 55 

獲取COL1-COL4的最大絕對值

diff_row = df.max(axis=1) - df.min(axis=1) 
print(diff_row.idxmax()) 

電流輸出:

3 

所需的輸出:

Dallas 

回答

2

傳遞索引標籤loc和感興趣的山坳:

In[198]: 
df.loc[diff_row.idxmax(), 'City'] 

Out[198]: 'Dallas' 
+0

感謝,正是我一直在尋找。 – MBasith

1

退一步,並使用numpy.ptp(峯峯值)做的最大少分鐘減法。

df.set_index('City').apply(np.ptp, 1).idxmax() 

'Dallas' 

我們可以更在推到numpy

df.City.values[np.ptp(df.set_index('City').values, 1).argmax()] 

'Dallas' 

定時

%timeit df.City.values[np.ptp(df.set_index('City').values, 1).argmax()] 
%timeit df.set_index('City').apply(np.ptp, 1).idxmax() 
1000 loops, best of 3: 399 µs per loop 
1000 loops, best of 3: 1.03 ms per loop 

%%timeit 
diff_row = df.max(axis=1) - df.min(axis=1) 
df.loc[diff_row.idxmax(), 'City'] 
1000 loops, best of 3: 1.24 ms per loop 
+0

這也是一種很酷的方式。不幸的是我需要完成這個沒有numpy。但將保留此以備將來參考。感謝您的迴應! – MBasith

+0

@MBasith如果你有熊貓,你有'numpy'並且總是可以用'pd.np'來引用它。大熊貓進口不規則。此外,如果您發現這個有用,可隨時投票回答。 – piRSquared

相關問題