Bagaimana cara menemukan kolom numerik di Pandas?


121

Katakanlah dfadalah DataFrame pandas. Saya ingin mencari semua kolom tipe numerik. Sesuatu seperti:

isNumeric = is_numeric(df)

Anda harus menentukan apakah kolom yang telah dtypemenjadi object, tetapi semua elemen menjadi numerik, dianggap sebagai numerik atau tidak. Jika tidak, ambillah jawaban Hanan, karena ini juga lebih cepat. Jika tidak, ambil punyaku.
FooBar

Apa yang terjadi jika Anda mencoba kolom df.describe (). Kemudian tetapkan ke variabel.
Coldy

Jawaban:


146

Anda bisa menggunakan select_dtypesmetode DataFrame. Ini mencakup dua parameter termasuk dan mengecualikan. Jadi isNumeric akan terlihat seperti:

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']

newdf = df.select_dtypes(include=numerics)

94
Anda dapat menggunakan df.select_dtypes (include = [np.number]) jika Anda tidak perlu menentukan daftar 'numerik'
KieranPC

23
Membangun dari tip di komentar sebelumnya (+1), Anda bisa menggunakan list(df.select_dtypes(include=[np.number]).columns.values) untuk mendapatkan daftar nama kolom numerik
user799188

76

Anda bisa menggunakan fungsi tidak berdokumen _get_numeric_data()untuk memfilter kolom numerik saja:

df._get_numeric_data()

Contoh:

In [32]: data
Out[32]:
   A  B
0  1  s
1  2  s
2  3  s
3  4  s

In [33]: data._get_numeric_data()
Out[33]:
   A
0  1
1  2
2  3
3  4

Perhatikan bahwa ini adalah "metode pribadi" (yaitu, detail penerapan) dan dapat berubah atau dihapus total di masa mendatang. Gunakan dengan hati-hati .


1
Sangat berguna; apakah ini didokumentasikan di mana saja? Khawatir tentang itu menghilang dalam versi mendatang dan / atau ketidakstabilan, karena awalan garis bawah menunjukkan bahwa itu dimaksudkan untuk menjadi pribadi.
ijoseph

3
Tidak, ini tidak didokumentasikan di mana pun. Implementasinya ada di sini , namun, seperti yang disebutkan @ijoseph, saya akan berhati-hati dalam menggunakan metode yang dimulai dengan garis bawah karena tidak lebih dari detail implementasi. Gunakan jawaban lain selain ini secara harfiah.
cs95

Persis. Sebagai praktik terbaik, saya mencoba menggunakan dan mengonversi ke metode numpy sebanyak mungkin. Ini karena dinamisme panda. API sering berubah. Untuk metode yang tidak terdokumentasi, itu hanya sembrono, tidak peduli seberapa berguna itu.
mik

69

Jawaban satu baris sederhana untuk membuat kerangka data baru dengan hanya kolom numerik:

df.select_dtypes(include=np.number)

Jika Anda menginginkan nama kolom numerik:

df.select_dtypes(include=np.number).columns.tolist()

Kode lengkap:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': range(7, 10),
                   'B': np.random.rand(3),
                   'C': ['foo','bar','baz'],
                   'D': ['who','what','when']})
df
#    A         B    C     D
# 0  7  0.704021  foo   who
# 1  8  0.264025  bar  what
# 2  9  0.230671  baz  when

df_numerics_only = df.select_dtypes(include=np.number)
df_numerics_only
#    A         B
# 0  7  0.704021
# 1  8  0.264025
# 2  9  0.230671

colnames_numerics_only = df.select_dtypes(include=np.number).columns.tolist()
colnames_numerics_only
# ['A', 'B']

2
df.select_dtypes(include=['int64']).columns.tolist()
Cherry Wu

Jika Anda hanya menginginkan satu jenis, Anda tidak perlu menyimpannya dalam daftar. Anda juga tidak perlu menentukan include=. select_dtypes(np.number)
BallpointBen

Jika kolom Anda memiliki data numerik tetapi juga memiliki None, dtype-nya bisa berupa 'object'. Ini akan memaksa kolom menjadi numerik:df.fillna(value=0, inplace=True)
vaughnkoch

26
df.select_dtypes(exclude=['object'])

7
kolom tanggal waktu adalah tipe yang berbeda datetimedan bukan tipe numerik
Jeru Luke

15

Satu baris sederhana:

df.select_dtypes('number').columns

2
Sejauh ini cara yang paling Pythonic, ya.
jorijnsmit

6

Kode berikut akan mengembalikan daftar nama kolom numerik dari suatu kumpulan data.

cnames=list(marketing_train.select_dtypes(exclude=['object']).columns)

berikut marketing_trainadalah kumpulan data saya dan select_dtypes()berfungsi untuk memilih tipe data menggunakan exclude dan include argumen dan kolom digunakan untuk mengambil nama kolom dari kumpulan data output dari kode di atas adalah sebagai berikut:

['custAge',
     'campaign',
     'pdays',
     'previous',
     'emp.var.rate',
     'cons.price.idx',
     'cons.conf.idx',
     'euribor3m',
     'nr.employed',
     'pmonths',
     'pastEmail']

Terima kasih


4

Ini adalah kode sederhana lainnya untuk menemukan kolom numerik dalam bingkai data panda,

numeric_clmns = df.dtypes[df.dtypes != "object"].index 

1
def is_type(df, baseType):
    import numpy as np
    import pandas as pd
    test = [issubclass(np.dtype(d).type, baseType) for d in df.dtypes]
    return pd.DataFrame(data = test, index = df.columns, columns = ["test"])
def is_float(df):
    import numpy as np
    return is_type(df, np.float)
def is_number(df):
    import numpy as np
    return is_type(df, np.number)
def is_integer(df):
    import numpy as np
    return is_type(df, np.integer)

1

Mengadaptasi jawaban ini , Anda bisa melakukannya

df.ix[:,df.applymap(np.isreal).all(axis=0)]

Di sini, np.applymap(np.isreal)memperlihatkan apakah setiap sel dalam bingkai data adalah numerik, dan .axis(all=0)memeriksa apakah semua nilai dalam kolom adalah True dan mengembalikan serangkaian Boolean yang dapat digunakan untuk mengindeks kolom yang diinginkan.


1

Silakan lihat kode di bawah ini:

if(dataset.select_dtypes(include=[np.number]).shape[1] > 0):
display(dataset.select_dtypes(include=[np.number]).describe())
if(dataset.select_dtypes(include=[np.object]).shape[1] > 0):
display(dataset.select_dtypes(include=[np.object]).describe())

Dengan cara ini Anda dapat memeriksa apakah nilainya numerik seperti float dan int atau nilai srting. yang kedua jika pernyataan digunakan untuk memeriksa nilai string yang dirujuk oleh objek.


1

Kami dapat menyertakan dan mengecualikan tipe data sesuai kebutuhan seperti di bawah ini:

train.select_dtypes(include=None, exclude=None)
train.select_dtypes(include='number') #will include all the numeric types

Dirujuk dari Jupyter Notebook.

Untuk memilih semua tipe numerik , gunakan np.numberatau'number'

  • Untuk memilih string Anda harus menggunakan objectdtype tetapi perhatikan bahwa ini akan mengembalikan semua kolom dtype objek

  • Lihat NumPy dtype hierarchy <http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html>__

  • Untuk memilih waktu, gunakan np.datetime64, 'datetime'atau 'datetime64'

  • Untuk memilih sabuk waktu, gunakan np.timedelta64, 'timedelta'atau 'timedelta64'

  • Untuk memilih jenis kategori Pandas, gunakan 'category'

  • Untuk memilih Pandas datetimetz dtypes, gunakan 'datetimetz'(baru di 0.20.0) atau "'datetime64 [ns, tz]'

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.