协慌网

登录 贡献 社区

在 pandas 数据框中选择多个列

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

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

如何选择'a''b'并将其保存到 df1?

我试过了

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 ,您需要知道列位置(或索引)。由于列位置可能会发生变化,而不是硬编码索引,您可以使用ilocget_loc对象的columns方法的get_loc函数来获取列索引。

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

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

假设您的列名称( 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切片,但.columns切片界面可能更自然,因为它使用了 vanilla 1-D python 列表索引 / 切片语法。

警告: 'index'DataFrame列的错误名称。相同的标签也用于真正的df.index属性,即Index数组。所以你的列由df['index']返回,真正的 DataFrame 索引由df.index返回。 Index是一种特殊类型的Series经过优化以查找其元素的值。对于 df.index,它用于按标签查找行。该df.columns属性也是一个pd.Index数组,用于按标签查找列。

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

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

相当于

df[['C', 'D', 'E']]  # or df.loc[:, ['C', 'D', '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
...