Saya memuat beberapa data pembelajaran mesin dari file CSV. 2 kolom pertama adalah observasi dan kolom lainnya adalah fitur.
Saat ini, saya melakukan hal berikut:
data = pandas.read_csv('mydata.csv')
yang memberikan sesuatu seperti:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
Saya ingin mengiris dataframe ini dalam dua dataframes: satu berisi kolom a
dan b
dan satu berisi kolom c
, d
dan e
.
Tidak mungkin menulis sesuatu seperti
observations = data[:'c']
features = data['c':]
Saya tidak yakin apa metode terbaik. Apakah saya perlu pd.Panel
?
By the way, saya menemukan pengindeksan dataframe cukup tidak konsisten: data['a']
diizinkan, tetapi data[0]
tidak. Di sisi lain, data['a':]
tidak diizinkan tetapi data[0:]
. Apakah ada alasan praktis untuk ini? Ini benar-benar membingungkan jika kolom diindeks oleh Int, mengingat hal itudata[0] != data[0:1]
df[5:10]
ditambahkan untuk memilih baris ( pandas.pydata.org/pandas-docs/stable/… )Jawaban:
2017 Jawaban - panda 0.20: .ix sudah usang. Gunakan .loc
Lihat penghinaan dalam dokumen
.loc
menggunakan pengindeksan berbasis label untuk memilih baris dan kolom. Label menjadi nilai indeks atau kolom. Mengiris dengan.loc
menyertakan elemen terakhir..loc
menerima notasi irisan yang sama yang dilakukan daftar Python untuk baris dan kolom. Notasi slice sedangstart:stop:step
Anda dapat mengiris baris dan kolom. Misalnya, jika Anda memiliki 5 baris dengan label
v
,w
,x
,y
,z
sumber
df['newcol'] = df.apply(lambda row: myfunc(row), axis=1)
maka Anda dapat dimyfunc(row){
... gunakanrow['foo':'ant']
. misalnya (menurut jawaban StackOverflow ini ), di dalammyfunc
Anda dapat menilai apakah ini non-numerik:row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
.iloc
harus digunakan sekarang, bukan.loc
. Perbaiki itu, dan saya akan memperbaikinya.Catatan:
.ix
telah ditinggalkan sejak Pandas v0.20. Anda sebaiknya menggunakan.loc
atau.iloc
, jika perlu.Indeks DataFrame.ix adalah apa yang ingin Anda akses. Agak membingungkan (saya setuju bahwa pengindeksan Pandas kadang-kadang membingungkan!), Tetapi yang berikut tampaknya melakukan apa yang Anda inginkan:
di mana .ix [irisan baris, irisan kolom] adalah apa yang ditafsirkan. Lebih lanjut tentang pengindeksan Pandas di sini: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced
sumber
>>>data.ix[:, 'a':'c'] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159
df.ix[:,[0,3,4]]
df.ix[:,'b':'e']
?loc
daripadaix
: stackoverflow.com/a/31593712/4323Mari kita gunakan dataset titanic dari paket seaborn sebagai contoh
atau
sumber
.ix
sudah usang.Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.
saat Anda menggunakandf.loc[:, some_list_of_columns]
Juga, Diberi DataFrame
seperti pada contoh Anda, jika Anda ingin mengekstrak kolom a dan d saja (yaitu kolom 1 dan 4), iloc mothod dari panda dataframe adalah apa yang Anda butuhkan dan dapat digunakan dengan sangat efektif. Yang perlu Anda ketahui adalah indeks kolom yang ingin Anda ekstrak. Sebagai contoh:
akan memberimu
sumber
Anda dapat mengiris sepanjang kolom a
DataFrame
dengan merujuk pada nama setiap kolom dalam daftar, seperti:sumber
get_loc
fungsi inidata.columns
untuk menentukan indeks kolom 'b' atau apa pun.Dan jika Anda datang ke sini mencari untuk mengiris dua rentang kolom dan menggabungkannya bersama (seperti saya), Anda dapat melakukan sesuatu seperti
Ini akan membuat kerangka data baru dengan 900 kolom pertama dan (semua) kolom> 3593 (dengan asumsi Anda memiliki sekitar 4000 kolom dalam kumpulan data Anda).
sumber
Inilah cara Anda dapat menggunakan metode yang berbeda untuk melakukan pemotongan kolom selektif, termasuk label selektif berdasarkan, indeks berdasarkan dan pemotongan kolom berdasarkan rentang selektif.
sumber
Itu setara
sumber
jika bingkai data terlihat seperti itu:
dan OUTPUT bisa seperti
jika Anda menggunakan np.logical_not operator logis
lebih tentang
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html
operator logis lainnya
logical_and (x1, x2, / [, out, where, ...]) Hitung nilai kebenaran dari elemen x1 AND x2.
logical_or (x1, x2, / [, out, where, casting, ...]) Hitung nilai kebenaran dari elemen x1 OR x2.
sumber
Cara lain untuk mendapatkan subset kolom dari DataFrame Anda, dengan asumsi Anda menginginkan semua baris, adalah dengan melakukan:
data[['a','b']]
dandata[['c','d','e']]
Jika Anda ingin menggunakan indeks kolom numerik yang dapat Anda lakukan:
data[data.columns[:2]]
dandata[data.columns[2:]]
sumber