如何从df中选择列a和b,并将它们保存到新的数据帧df1中?

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

尝试失败:

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

当前回答

列名(字符串)无法按您尝试的方式进行切片。

这里有两个选项。如果您从上下文中知道要分割哪些变量,只需通过将列表传递到__getitem_语法([])中,即可返回这些列的视图。

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

或者,如果重要的是对它们进行数字索引,而不是按它们的名称进行索引(假设您的代码应该在不知道前两列的名称的情况下自动进行索引),那么您可以改为这样做:

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

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

然而,有时Pandas中有一些索引约定不这样做,而是给你一个新变量,它只引用与原始对象中的子对象或切片相同的内存块。这将发生在第二种索引方式中,因此您可以使用.copy()方法对其进行修改以获得常规副本。当发生这种情况时,更改您认为的切片对象有时会更改原始对象。时刻注意这一点总是很好的。

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

要使用iloc,您需要知道列位置(或索引)。由于列位置可能会改变,您可以使用iloc和dataframe对象的columns方法的get_loc函数来获取列索引,而不是硬编码索引。

{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}

现在,您可以使用此字典通过名称和iloc访问列。

其他回答

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

只是说说而已

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

将返回仅包含列b和c的DataFrame。

此处记录了drop方法。

也可以使用df.pop():

>>> df = pd.DataFrame([('falcon', 'bird',    389.0),
...                    ('parrot', 'bird',     24.0),
...                    ('lion',   'mammal',   80.5),
...                    ('monkey', 'mammal', np.nan)],
...                   columns=('name', 'class', 'max_speed'))
>>> df
     name   class  max_speed
0  falcon    bird      389.0
1  parrot    bird       24.0
2    lion  mammal       80.5
3  monkey  mammal

>>> df.pop('class')
0      bird
1      bird
2    mammal
3    mammal
Name: class, dtype: object

>>> df
     name  max_speed
0  falcon      389.0
1  parrot       24.0
2    lion       80.5
3  monkey        NaN

请使用df.pop(c)。

我认为这是实现目标的最简单方法。

熊猫作为pd进口列=[a','b']df1=pd.DataFrame(df,columns=cols)df1=df.iloc[:,0:2]

从0.11.0版起,可以使用.loc索引器以尝试的方式对列进行切片:

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

相当于

df[['C', 'D', 'E']]  # or df.loc[:, ['C', 'D', 'E']]

并返回列C到E。


随机生成的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,False,False,False],dtype=bool)-如果列名在列表['B','C','D']中,则返回True;否则为False。

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
...

我已经看到了几个答案,但其中一个仍然不清楚。你会如何选择那些感兴趣的专栏?

答案是,如果您将它们收集在列表中,则可以使用列表引用列。

实例

print(extracted_features.shape)
print(extracted_features)

(63,)
['f000004' 'f000005' 'f000006' 'f000014' 'f000039' 'f000040' 'f000043'
 'f000047' 'f000048' 'f000049' 'f000050' 'f000051' 'f000052' 'f000053'
 'f000054' 'f000055' 'f000056' 'f000057' 'f000058' 'f000059' 'f000060'
 'f000061' 'f000062' 'f000063' 'f000064' 'f000065' 'f000066' 'f000067'
 'f000068' 'f000069' 'f000070' 'f000071' 'f000072' 'f000073' 'f000074'
 'f000075' 'f000076' 'f000077' 'f000078' 'f000079' 'f000080' 'f000081'
 'f000082' 'f000083' 'f000084' 'f000085' 'f000086' 'f000087' 'f000088'
 'f000089' 'f000090' 'f000091' 'f000092' 'f000093' 'f000094' 'f000095'
 'f000096' 'f000097' 'f000098' 'f000099' 'f000100' 'f000101' 'f000103']

我有以下列表/NumPy数组extracted_features,指定了63列。原始数据集有103列,我想提取这些列,然后使用

dataset[extracted_features]

你最终会得到这个

这是你在机器学习中经常用到的东西(更具体地说,在特征选择中)。我也想讨论其他方式,但我认为其他Stack Overflower用户已经涵盖了这一点。