182

I tried:

x=pandas.DataFrame(...)
s = x.take([0], axis=1)

And s gets a DataFrame, not a Series.

6 Answers 6

162

From v0.11+, ... use df.iloc.

In [7]: df.iloc[:,0]
Out[7]: 
0    1
1    2
2    3
3    4
Name: x, dtype: int64
Sign up to request clarification or add additional context in comments.

1 Comment

This is the most compatible version with the new releases and also with the old ones. And probably the most efficient since the dev team is officially promoting this approach.
155
>>> import pandas as pd
>>> df = pd.DataFrame({'x' : [1, 2, 3, 4], 'y' : [4, 5, 6, 7]})
>>> df
   x  y
0  1  4
1  2  5
2  3  6
3  4  7
>>> s = df.ix[:,0]
>>> type(s)
<class 'pandas.core.series.Series'>
>>>

===========================================================================

UPDATE

If you're reading this after June 2017, ix has been deprecated in pandas 0.20.2, so don't use it. Use loc or iloc instead. See comments and other answers to this question.

7 Comments

df.set_index('x').y
Would be worth adding the .iloc alternative (as proposed by Jeff further down on this page), as it is not ambiguous in the presence of columns with numbers for names.
The answer was given in 2013; as far as I remember, .iloc wasn't there yet back then. In 2016, the correct answer is Jeff's (after all he's pandas God, mind you ;-)). I'm not sure what's SO's policy regarding update of answers due to API change; I'm honestly surprised by the number of votes for this answer, didn't think it was that useful to people...
Another note: ix was deprecated in version 0.20.
ix should not be used anymore, use iloc instead: s = df.ix[:,0]. See this post for a comparison of iloc and ix.
|
125

You can get the first column as a Series by following code:

x[x.columns[0]]

4 Comments

how can i get the last column like that?
The others work fine as well, but this one seems more intuitive.
This is no good if you have multiple columns with the same name. Whether column names should be unique or not is a separate discussion.
@Polly x[x.columns[x.columns.size-1]]
13

Isn't this the simplest way?

By column name:

In [20]: df = pd.DataFrame({'x' : [1, 2, 3, 4], 'y' : [4, 5, 6, 7]})
In [21]: df
Out[21]:
    x   y
0   1   4
1   2   5
2   3   6
3   4   7

In [23]: df.x
Out[23]:
0    1
1    2
2    3
3    4
Name: x, dtype: int64

In [24]: type(df.x)
Out[24]:
pandas.core.series.Series

2 Comments

In this particular case you know the name of the first column ("x"), but what the question meant was: "How can I access the first column, REGARDLESS of it's name". Also, accessing columns like this (df.x) is not generic -- what if the column name contains spaces? What if the name of the column coincides with DataFrame-s attribute name? It's more general to access columns using __getitem__ (i.e. like so: df["x"]).
Also doesn't work if the column's header has e.g. spaces in it.
4

This works great when you want to load a series from a csv file

x = pd.read_csv('x.csv', index_col=False, names=['x'],header=None).iloc[:,0]
print(type(x))
print(x.head(10))


<class 'pandas.core.series.Series'>
0    110.96
1    119.40
2    135.89
3    152.32
4    192.91
5    177.20
6    181.16
7    177.30
8    200.13
9    235.41
Name: x, dtype: float64

Comments

4
df[df.columns[i]]

where i is the position/number of the column(starting from 0).

So, i = 0 is for the first column.

You can also get the last column using i = -1

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.