2016-04-28 65 views
2

我在尋找最有效的方式來選擇一個數據幀的多個列:有效列索引和選擇在大熊貓

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.rand(4,8), columns = list('abcdefgh')) 

result of code above

我要選擇列下面列的, C,E,F,只有g,這可以通過使用索引來完成:

df.ix[:,[0,2,4,5,6]] 

對於許多列的大的數據幀,這似乎是一個低效的方法和我會畝CH而是由範圍指定連續的列索引,如果可能的話,但嘗試,如下面都扔了語法錯誤:

df.ix[:,[0,2,4:6]] 

df.ix[:,[0,2,[4:6]]] 

回答

1

我認爲你可以使用range

print [0,2] + range(4,7) 
[0, 2, 4, 5, 6] 


print df.ix[:, [0,2] + range(4,7)] 
      a   c   e   f   g 
0 0.278231 0.192650 0.653491 0.944689 0.663457 
1 0.416367 0.477074 0.582187 0.730247 0.946496 
2 0.396906 0.877941 0.774960 0.057290 0.556719 
3 0.119685 0.211581 0.526096 0.213282 0.492261 
+0

非常好,您的回答也讓我發現更多關於「範圍」命令的靈活性! http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer – thescoop

-1

大熊貓是比較深思熟慮,最短的方法是最有效的:

df[['a','c','e','f','g']] 

您不需要ix,因爲它會在您的數據中執行搜索,但是您顯然需要這些列的名稱。

+0

來自pandas文檔:注意Python和NumPy索引操作符[]和屬性操作符。在廣泛的用例中提供對熊貓數據結構的快速和輕鬆訪問。這使得交互式工作變得直觀,因爲如果你已經知道如何處理Python字典和NumPy數組,那麼學到的東西很少。但是,由於要訪問的數據的類型並不是事先知道的,因此直接使用標準操作符有一些優化限制。對於產品代碼,我們建議您利用本章中提供的優化的熊貓數據訪問方法。 –

1

只要您選擇不相鄰的列,您將支付負擔。
如果你的數據是同質的,回落到numpy給你顯着的改善。

In [147]: %timeit df[['a','c','e','f','g']] 
      %timeit df.values[:,[0,2,4,5,6]] 
      %timeit df.ix[:,[0,2,4,5,6]] 
      %timeit pd.DataFrame(df.values[:,[0,2,4,5,6]],columns=df.columns[[0,2,4,5,6]]) 
100 loops, best of 3: 2.67 ms per loop 
10000 loops, best of 3: 58.7 µs per loop 
1000 loops, best of 3: 1.81 ms per loop 
1000 loops, best of 3: 568 µs per loop