2013-05-28 37 views
42

从熊猫数据框中选择单个列(如df.iloc[:, 0],df['A']df.A等)时,生成的向量会自动转换为Series而不是单列数据帧。但是,我正在编写一些将DataFrame作为输入参数的函数。因此,我更喜欢处理单列DataFrame而不是Series,以便该函数可以假设可以访问df.columns。现在我必须使用类似pd.DataFrame(df.iloc[:, 0])的方式将Series明确转换为DataFrame。这似乎不是最干净的方法。有没有更好的方法直接从DataFrame进行索引,以便结果是单列DataFrame而不是Series?Python熊猫:将选定的列保留为DataFrame而不是系列

+6

df.iloc [:,[0]]或df [['A']]; df.A只会回馈一系列 – Jeff

回答

47

由于@Jeff提到有几个方法可以做到这一点,但我建议使用LOC/ILOC更明确的(和早期引发错误,如果你尝试一些暧昧):

In [10]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B']) 

In [11]: df 
Out[11]: 
    A B 
0 1 2 
1 3 4 

In [12]: df[['A']] 

In [13]: df[[0]] 

In [14]: df.loc[:, ['A']] 

In [15]: df.iloc[:, [0]] 

Out[12-15]: # they all return the same thing: 
    A 
0 1 
1 3 

后两个在整数列名称的情况下选择删除歧义(正是为什么创建loc/iloc)。例如:

In [16]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 0]) 

In [17]: df 
Out[17]: 
    A 0 
0 1 2 
1 3 4 

In [18]: df[[0]] # ambiguous 
Out[18]: 
    A 
0 1 
1 3 
+2

抱歉打扰你,但这只是一个非常快速的问题。我看到额外的'[]'如何使结果成为'DataFrame'而不是'Series',但pandas文档中的这种索引语法是在哪里讨论的?我只是想获得这种索引技术的“官方”名称,以便我真正理解它。谢谢! –

+2

@sparc_spread http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics“您可以将列的列表传递给[]以按照该顺序选择列。”我不确定这是否有名字! –

+0

是的,它看起来没有 - 但我会从现在开始继续使用它。令人惊讶的是API和文档都埋藏了多少东西。谢谢! –