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)
Hanan Shteingart
sumber
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)
Anand
sumber
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 .

Kathirmani Sukumar
sumber
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']
stackoverflowuser2010
sumber
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'])
BEN_YO
sumber
7
kolom tanggal waktu adalah tipe yang berbeda datetimedan bukan tipe numerik
Jeru Luke
15

Satu baris sederhana:

df.select_dtypes('number').columns
gesit
sumber
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

Hukmaram
sumber
4

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

numeric_clmns = df.dtypes[df.dtypes != "object"].index 
Anvesh_vs
sumber
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)
Hanan Shteingart
sumber
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.

Garrett
sumber
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.

mickey
sumber
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]'

Muralitharan Sathyamoorthy
sumber