在pandas数据框中select列

我有不同的列中的数据,但我不知道如何提取它保存在另一个variables。

index abc 1 2 3 4 2 3 4 5 

如何select'b''c'并将其保存到df1中?

我试过了

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

似乎没有工作。 任何想法将有助于感谢。

列名称(这是string)不能以您尝试的方式切片。

在这里你有几个选项。 如果你从上下文知道你想要分割出哪些variables,你可以通过传递一个列表到__getitem__语法([]')来返回只有这些列的视图。

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

另外,如果要索引他们的数字而不是他们的名字(说你的代码应该自动做这不知道前两列的名称),那么你可以这样做,而不是:

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

此外,您应该熟悉一下Pandas对象视图与该对象副本的概念。 上述第一种方法将返回所需子对象(所需切片)的内存中的新副本。

然而,有时在Pandas中有一些索引约定不这样做,而是给你一个新的variables,它指向与原始对象中的子对象或切片相同的内存块。 第二种索引方式会发生这种情况,所以您可以使用copy()函数修改它以获取常规副本。 发生这种情况时,改变你认为的切片对象有时可以改变原始对象。 总是善于留意这一点。

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

假设你的列名( 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列表索引/切片语法。

WARN: 'index'DataFrame列的错误名称。 同样的标签也用于真正的df.index属性,一个Index数组。 所以你的列是由df['index']返回的,真正的DataFrame索引是由df.index返回的。 Index是针对查找元素值而优化的一种特殊types的Index 。 对于df.index,它是通过标签查找行的。 该df.columns属性也是一个pd.Index数组,用于通过标签查找列。

 In [39]: df Out[39]: index abc 0 1 2 3 4 1 2 3 4 5 In [40]: df1 = df[['b', 'c']] In [41]: df1 Out[41]: bc 0 3 4 1 4 5 

从版本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: ABCDEF 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: CDE R0 61 16 73 R1 30 80 7 R2 80 27 44 R3 47 30 84 R4 41 62 1 R5 5 58 0 ... 

基于标签select行也是一样的。 从这些列中获取“R6”到“R10”行:

 df.loc['R6':'R10', 'C':'E'] Out: CDE R6 51 27 31 R7 83 19 18 R8 11 67 65 R9 78 27 29 R10 7 16 94 

.loc也接受一个布尔数组,所以你可以select数组中相应条目为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: BCD R0 78 61 16 R1 27 30 80 R2 53 80 27 R3 65 47 30 R4 9 41 62 R5 78 5 58 ... 

我意识到这个问题是相当古老,但在最新版本的pandas有一个简单的方法来做到这一点。 列名(string) 可以用任何你喜欢的方式切片。

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

您可以提供要删除的列的列表,并返回DataFrame,只使用在Pandas DataFrame上使用drop()函数所需的列。

只是说

 colsToDrop = ['a'] df.drop(colsToDrop, axis=1) 

将只返回一个DataFrame bc列。

这里介绍了drop方法。

我发现这个方法非常有用:

iloc [行切片,列切片]

surveys_df.iloc [0:3,1:4]

更多细节可以在这里find

只需使用:它会selectb和c列。

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

那么你可以调用df1:

 df1