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 许可协议
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 许可协议
从 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).
并返回列 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, 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 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
无法以您尝试的方式对列名(字符串)进行切片。
在这里,您有几个选择。如果您从上下文中知道要切出哪些变量,则可以通过将列表传递给
__getitem__
语法([])来仅返回这些列的视图。或者,如果对它们进行数字索引而不是它们的名称很重要(例如,您的代码应该在不知道前两列的名称的情况下自动执行此操作),那么您可以这样做:
此外,您应该熟悉 Pandas 对象的视图与该对象的副本的概念。上述方法中的第一个将在内存中返回所需子对象(所需切片)的新副本。
然而,有时 Pandas 中的索引约定不这样做,而是为您提供一个新变量,该变量仅引用与原始对象中的子对象或切片相同的内存块。第二种索引方式会发生这种情况,因此您可以使用
.copy()
方法对其进行修改以获取常规副本。发生这种情况时,更改您认为的切片对象有时会更改原始对象。随时注意这一点总是好的。要使用
iloc
,您需要知道列位置(或索引)。由于列位置可能会改变,而不是硬编码索引,您可以使用iloc
以及get_loc
函数columns
数据帧对象的方法来获取列索引.现在您可以使用此字典通过名称访问列,并使用
iloc
。