我有不同列中的数据,但我不知道如何提取它以将其保存在另一个变量中。
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
方法获取数据帧对象以获取列索引。
{df.columns.get_loc(c):c for idx, c in enumerate(df.columns)}
现在,您可以使用此字典通过名称和使用iloc
访问列。
如果你想逐行索引和列名称,你可以像df['b'][0]
一样。它就像你可以想象一样简单。
或者您可以使用df.ix[0,'b']
,索引和标签的混合使用。
注意:自v0.20 ix
被弃用以支持loc
/ iloc
。
上述响应中讨论的不同方法基于以下假设:用户知道要丢弃或子集的列索引,或者用户希望使用一系列列(例如,在'C':'E'之间)对数据帧进行子集化。 pandas.DataFrame.drop()当然是基于用户定义的列列表来子集数据的选项(尽管你必须小心,你总是使用数据帧的副本,并且inplace参数不应该设置为True !!)
另一种选择是使用pandas.columns.difference(),它对列名进行设置差异,并返回包含所需列的索引类型的数组。以下是解决方案:
df = pd.DataFrame([[2,3,4],[3,4,5]],columns=['a','b','c'],index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)
输出将是:
b c
1 3 4
2 4 5
以下是我的代码:
import pandas as pd
df = pd.read_excel("data.xlsx", sheet_name = 2)
print df
df1 = df[['emp_id','date']]
print df1
输出:
emp_id date count
0 1001 11/1/2018 3
1 1002 11/1/2018 4
2 11/2/2018 2
3 11/3/2018 4
emp_id date
0 1001 11/1/2018
1 1002 11/1/2018
2 11/2/2018
3 11/3/2018
第一个数据帧是主数据帧。我刚刚将两列复制到df1中。
你可以使用熊猫。我创建了DataFrame:
import pandas as pd
df = pd.DataFrame([[1, 2,5], [5,4, 5], [7,7, 8], [7,6,9]],
index=['Jane', 'Peter','Alex','Ann'],
columns=['Test_1', 'Test_2', 'Test_3'])
DataFrame:
Test_1 Test_2 Test_3
Jane 1 2 5
Peter 5 4 5
Alex 7 7 8
Ann 7 6 9
要按名称选择1个或多个列:
df[['Test_1','Test_3']]
Test_1 Test_3
Jane 1 5
Peter 5 5
Alex 7 8
Ann 7 9
您还可以使用:
df.Test_2
并获得列qazxsw poi
Test_2
您还可以使用 Jane 2
Peter 4
Alex 7
Ann 6
从这些行中选择列和行。这称为“切片”。请注意,我从列.loc()
to Test_1
Test_3
“Slice”是:
df.loc[:,'Test_1':'Test_3']
如果你只想要 Test_1 Test_2 Test_3
Jane 1 2 5
Peter 5 4 5
Alex 7 7 8
Ann 7 6 9
和Peter
列的Ann
和Test_1
:
Test_3
你得到:
df.loc[['Peter', 'Ann'],['Test_1','Test_3']]
一种不同且简单的方法:迭代行
Test_1 Test_3
Peter 5 5
Ann 7 9
从0.21.0开始,使用`df1= pd.DataFrame() #creating an empty dataframe
for index,i in df.iterrows():
df1.loc[index,'A']=df.loc[index,'A']
df1.loc[index,'B']=df.loc[index,'B']
df1.head()
或.loc
以及包含一个或多个缺失标签的列表,不推荐使用[]
。那么,你的问题的答案是:
.reindex
在以前的版本中,使用df1 = df.reindex(columns=['b','c'])
只要找到至少一个键就可以工作(否则会引发一个.loc[list-of-labels]
)。不推荐使用此行为,现在会显示警告消息。推荐的替代方案是使用KeyError
。
在.reindex()
了解更多信息
我已经看到了几个答案,但对我来说还不清楚。您如何选择感兴趣的列?答案是,如果将它们聚集在列表中,您只需使用列表引用列即可。
Indexing and Selecting Data
我有以下列表/ numpy数组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']
,指定63列。原始数据集有103列,我想提取那些,然后我会使用
extracted_features
而你最终会得到这个
dataset[extracted_features]
这是你经常在机器学习中使用的东西(更具体地说,在特征选择中)。我想讨论其他方法,但我认为其他stackoverflowers已经涵盖了。希望这有用!
假设您的列名称(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在his answer中指出的那样,df.ix
更简洁地对列进行切片,但.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
...
In [39]: df
Out[39]:
index a b c
0 1 2 3 4
1 2 3 4 5
In [40]: df1 = df[['b', 'c']]
In [41]: df1
Out[41]:
b c
0 3 4
1 4 5
我意识到这个问题已经很老了,但在最新版本的熊猫中,有一种简单的方法可以做到这一点。列名(字符串)可以按照您喜欢的方式进行切片。
columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)
您可以提供要删除的列的列表,并使用Pandas DataFrame上的drop()
函数返回仅包含所需列的DataFrame。
只是说
colsToDrop = ['a']
df.drop(colsToDrop, axis=1)
只返回列b
和c
的DataFrame。
drop
方法记录了here。
只需使用:它将选择b和c列。
df1=pd.DataFrame()
df1=df[['b','c']]
然后你可以调用df1:
df1
有了熊猫,
机智列名称
dataframe[['column1','column2']]
使用iloc,可以使用列索引
dataframe[:,[1,2]]
可以使用loc列名称
dataframe[:,['column1','column2']]
希望能帮助到你 !