2013-02-25 78 views
16

我知道這些列切片方法:保持/切片特定列

df2 = df[["col1", "col2", "col3"]]df2 = df.ix[:,0:2]

,但我不知道是否有切離的前/中/終止列的方式一個數據幀在同一個切片中,沒有明確列出每一個。

例如,具有列col1,col2,col3,col4,col5和col6的數據幀df

有沒有辦法做這樣的事情?

df2 = df.ix[:, [0:2, "col5"]]

我的情況我有幾百列經常需要切片不同的請求特定的人。我已經通過文檔檢查,並沒有看到這樣的事情。我忽略了什麼?

謝謝!

*編輯更清楚我要找的東西。

回答

14

IIUC,最簡單的方法我能想到的會是這樣的:

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame(np.random.randn(5, 10)) 
>>> df[list(df.columns[:2]) + [7]] 
      0   1   7 
0 0.210139 0.533249 1.780426 
1 0.382136 0.083999 -0.392809 
2 -0.237868 0.493646 -1.208330 
3 1.242077 -0.781558 2.369851 
4 1.910740 -0.643370 0.982876 

其中list呼叫不是可選的,因爲否則Index對象將嘗試將自身載體添加到7.

這將是可能的特殊情況類似numpy的的r_使

df[col_[:2, "col5", 3:6]] 

會的工作,雖然我不知道這是否將是值得的麻煩。

-1

不確定你在問什麼。如果你想第一個和最後5行的特定列,你可以做這樣的事情

df = pd.DataFrame({'col1': np.random.randint(0,3,1000), 
       'col2': np.random.rand(1000), 
       'col5': np.random.rand(1000)}) 
In [36]: df['col5'] 
Out[36]: 
0  0.566218 
1  0.305987 
2  0.852257 
3  0.932764 
4  0.185677 
... 
996 0.268700 
997 0.036250 
998 0.470009 
999 0.361089 
Name: col5, Length: 1000 
In [38]: df['col5'][(df.index < 5) | (df.index > (len(df) - 5))] 
Out[38]: 
0  0.566218 
1  0.305987 
2  0.852257 
3  0.932764 
4  0.185677 
996 0.268700 
997 0.036250 
998 0.470009 
999 0.361089 
Name: col5 

,或者更一般地說,你可以寫一個函數

In [41]: def head_and_tail(df, n=5): 
    ...:  return df[(df.index < n) | (df.index > (len(df) - n))] 
In [44]: head_and_tail(df, 7) 
Out[44]: 
    col1  col2  col5 
0  0 0.489944 0.566218 
1  1 0.639213 0.305987 
2  1 0.000690 0.852257 
3  2 0.620568 0.932764 
4  0 0.310816 0.185677 
5  0 0.930496 0.678504 
6  2 0.165250 0.440811 
994  2 0.842181 0.636472 
995  0 0.899453 0.830839 
996  0 0.418264 0.268700 
997  0 0.228304 0.036250 
998  2 0.031277 0.470009 
999  1 0.542502 0.361089 
+0

我在尋找的是一種「保留」數據框中的特定列並排除其餘部分的方法。你所建議的方法適用於爲任何給定的列選擇數據框的第一行和最後一行**,然而我所追求的是一種使用切片中的組合範圍/列列來保留/刪除列的方法。 – bdiamante 2013-02-25 18:08:45

+0

因此,而不是我所包含的內容(前5行和後5行),您想要一種*排除*這些行的方式?你能給出一個具體的例子,用一個小數據框來展示你感興趣的子集嗎? – beardc 2013-02-25 18:34:55

4

如果您的列名具有您可以篩選的信息,則可以使用df.filter(regex ='name *')。 我正在使用它來過濾從a1_01到b3_21的189個數據通道,它工作正常。