python用法 - text plt python




在熊貓數據框中選擇列 (6)

我有不同列中的數據,但我不知道如何提取它以將其保存在另一個變量中。

index  a   b   c
1      2   3   4
2      3   4   5

如何選擇'b''c'並將其保存到df1中?

我試過了

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

沒有任何工作。


假設你的列名( df.columns )是['index','a','b','c'] ,那麼你想要的數據位於第3和第4列。 如果你的腳本運行時你不知道他們的名字,你可以這樣做

newdf = df[df.columns[2:4]] # Remember, Python is 0-offset! The "3rd" entry is at slot 2.

正如EMS在他的回答中指出的, df.ix切片列更簡潔一點,但.columns切片界面可能更自然,因為它使用了一維python列表索引/切片語法。

警告: 'index'DataFrame列的錯誤名稱。 同樣的標籤也用於真正的df.index屬性,一個Index數組。 所以你的列由df['index']返回,真正的DataFrame索引由df.index返回。 Index是一種特殊的Series可以查找其元素的值進行優化。 對於df.index,它用於通過標籤查找行。 該df.columns屬性也是一個pd.Index數組,用於通過標籤查找列。


列名(這是字符串)不能以您嘗試的方式切片。

這裡有幾個選項。 如果你從上下文知道你想要分割出哪些變量,只需通過將一個列表傳遞給__getitem__語法([]'),就可以僅返回那些列的視圖。

df1 = df[['a','b']]

或者,如果重要的是用數字而不是他們的名字來索引它們(比如說你的代碼應該在不知道前兩列名字的情況下自動執行此操作),那麼你可以這樣做:

df1 = df.iloc[:,0:2] # Remember that Python does not slice inclusive of the ending index.

另外,您應該熟悉Pandas對象視圖與該對象副本的概念。 上述第一種方法將返回所需子對象(所需切片)的內存中的新副本。

然而,有時候熊貓中的索引約定不會這樣做,而是給你一個新的變量,它指向與原始對像中的子對像或切片相同的內存塊。 這將在第二種索引方式下發生,因此您可以使用copy()函數修改它以獲取常規副本。 發生這種情況時,改變您認為的切片對像有時可能會改變原始對象。 總是很高興看到這一點。

df1 = df.iloc[0,0:2].copy() # To avoid the case where changing df1 also changes df

如果您想要按行索引和列名獲取一個元素,則可以像df['b'][0] 。 它就像你可以形像一樣簡單。

或者你可以使用df.ix[0,'b'] ,索引和標籤的混合使用。


從版本0.11.0開始, 可以按照您使用.loc索引器嘗試的方式對列進行切片:

df.loc[:, 'C':'E']

返回列CE

隨機生成的DataFrame演示:

import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)), 
                  columns=list('ABCDEF'), 
                  index=['R{}'.format(i) for i in range(100)])
df.head()

Out: 
     A   B   C   D   E   F
R0  99  78  61  16  73   8
R1  62  27  30  80   7  76
R2  15  53  80  27  44  77
R3  75  65  47  30  84  86
R4  18   9  41  62   1  82

要獲取從C到E的列(請注意,與整數切片不同,'E'包含在列中):

df.loc[:, 'C':'E']

Out: 
      C   D   E
R0   61  16  73
R1   30  80   7
R2   80  27  44
R3   47  30  84
R4   41  62   1
R5    5  58   0
...

根據標籤選擇行也是一樣。 從這些列中獲取行'R6'到'R10':

df.loc['R6':'R10', 'C':'E']

Out: 
      C   D   E
R6   51  27  31
R7   83  19  18
R8   11  67  65
R9   78  27  29
R10   7  16  94

.loc也接受一個布爾數組,因此您可以選擇其數組中相應條目為True 。 例如, df.columns.isin(list('BCD'))返回array([False, True, True, True, False, False], dtype=bool) - 如果列名在列表中,則為true ['B', 'C', 'D'] ; 否則,為假。

df.loc[:, df.columns.isin(list('BCD'))]

Out: 
      B   C   D
R0   78  61  16
R1   27  30  80
R2   53  80  27
R3   65  47  30
R4    9  41  62
R5   78   5  58
...

我意識到這個問題是相當古老的,但在熊貓的最新版本中有一個簡單的方法來做到這一點。 列名稱(即字符串) 可以用任何你喜歡的方式切片。

columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)

我發現這個方法非常有用:

# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]

更多細節可以在here找到





dataframe