2017-06-21 69 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

相关问题