我有不同列中的数据,但我不知道如何提取它以将其保存在另一个变量中。
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
,您需要知道列位置(或索引)。由于列位置可能会发生变化,而不是硬编码索引,您可以使用iloc
和get_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']]
并返回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)
- 如果列名在列表中,则为 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
...