在 Pandas 数据框中选择多列

新手上路,请多包涵

How do I select columns a and b from df , and save them into a new df1 ?

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

不成功的尝试:

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

原文由 user1234440 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

在这里,您有几个选择。如果您从上下文中知道要切出哪些变量,则可以通过将列表传递给 __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 以及 get_loc 函数 columns 数据帧对象的方法来获取列索引.

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

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

原文由 ely 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

得到与相同的列

df[['C', 'D', 'E']] # Mind, this makes a copy.

要么

df.loc[:, ['C', 'D', 'E']] # This does not make a copy (better).

并返回列 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

要获取从 CE 的列(请注意,与整数切片不同, 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
...

这同样适用于基于标签选择行。从这些列中获取行 R6R10

 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) - 如果列名在列表中则为真 ['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
...

原文由 ayhan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题