Bagaimana cara mendapatkan kolom pertama dari panda DataFrame sebagai Seri?

142

Saya mencoba:

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

Dan smendapat DataFrame, bukan Seri.

Yariv
sumber

Jawaban:

141
>>> 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'>
>>>

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

MEMPERBARUI

Jika Anda membaca ini setelah Juni 2017, ixtelah ditinggalkan dalam panda 0.20.2, jadi jangan gunakan itu. Gunakan locatau ilocsebagai gantinya. Lihat komentar dan jawaban lain untuk pertanyaan ini.

herrfz
sumber
4
df.set_index('x').y
herrfz
4
Layak menambahkan alternatif .iloc (seperti yang diusulkan oleh Jeff lebih lanjut di halaman ini), karena tidak ambigu di hadapan kolom dengan angka untuk nama.
sapo_cosmico
4
Jawabannya diberikan pada 2013; sejauh yang saya ingat, .ilocbelum ada di sana saat itu. Pada tahun 2016, jawaban yang benar adalah milik Jeff (lagipula dia adalah pandasTuhan, ingatlah ;-)). Saya tidak yakin apa kebijakan SO mengenai pembaruan jawaban karena perubahan API; Jujur saya terkejut dengan jumlah suara untuk jawaban ini, tidak berpikir itu berguna bagi orang-orang ...
herrfz
2
Catatan lain: ixsudah tidak digunakan lagi dalam versi 0.20.
ayhan
5
ixtidak boleh digunakan lagi, gunakan ilocsebagai gantinya: s = df.ix[:,0]. Lihat posting ini untuk perbandingan ilocdan ix.
normanius
117

Dari v0.11 +, ... gunakan df.iloc.

In [7]: df.iloc[:,0]
Out[7]: 
0    1
1    2
2    3
3    4
Name: x, dtype: int64
Jeff
sumber
3
Ini adalah versi yang paling kompatibel dengan rilis baru dan juga dengan yang lama. Dan mungkin yang paling efisien karena tim dev secara resmi mempromosikan pendekatan ini.
Gaborous
116

Anda bisa mendapatkan kolom pertama sebagai Seri dengan kode berikut:

x[x.columns[0]]
HYRY
sumber
bagaimana saya bisa mendapatkan kolom terakhir seperti itu?
Polly
Yang lain juga berfungsi dengan baik, tetapi yang ini tampaknya lebih intuitif.
elPastor
6
Ini tidak baik jika Anda memiliki beberapa kolom dengan nama yang sama. Apakah nama kolom harus unik atau tidak adalah diskusi terpisah.
Vishal
@Pollyx[x.columns[x.columns.size-1]]
fujianjin6471
13

Bukankah ini cara yang paling sederhana?

Menurut nama kolom:

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
SamJ
sumber
9
Dalam kasus khusus ini Anda tahu nama kolom pertama ("x"), tetapi yang dimaksud adalah: "Bagaimana saya bisa mengakses kolom pertama, TERKAIT DENGAN NAMA itu". Juga, mengakses kolom seperti ini ( df.x) bukan generik - bagaimana jika nama kolom berisi spasi? Bagaimana jika nama kolom bertepatan dengan DataFramenama atribut -s? Ini lebih umum untuk mengakses kolom menggunakan __getitem__(yaitu seperti:) df["x"].
ponadto
2
Juga tidak berfungsi jika tajuk kolom memiliki misalnya spasi di dalamnya.
Jean-François Corbett
3

Ini berfungsi dengan baik ketika Anda ingin memuat seri dari file csv

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
Christopher Pfeifer
sumber
0
df[df.columns[i]]

di mana iposisi / nomor kolom (mulai dari 0 ).

Begitu, i = 0 untuk kolom pertama.

Anda juga bisa mendapatkan kolom terakhir menggunakan i = -1

Ayan Kumar Saha
sumber