Làm cách nào để tìm các cột số trong Pandas?


121

Giả sử dflà DataFrame của gấu trúc. Tôi muốn tìm tất cả các cột kiểu số. Cái gì đó như:

isNumeric = is_numeric(df)

Bạn nên xác định xem một cột có dtypetồn tại hay không object, nhưng tất cả các yếu tố là số, được tính là số hay không. Nếu không, hãy lấy câu trả lời của Hanan, vì nó cũng nhanh hơn. Nếu không, lấy của tôi.
FooBar

Điều gì xảy ra nếu bạn chỉ đơn giản thử các cột df.describe (). Sau đó gán nó cho một biến.
lạnh lùng

Câu trả lời:


146

Bạn có thể sử dụng select_dtypesphương pháp của DataFrame. Nó bao gồm hai tham số bao gồm và loại trừ. Vì vậy, isNumeric sẽ trông như:

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

newdf = df.select_dtypes(include=numerics)

94
Bạn có thể sử dụng df.select_dtypes (bao gồm = [np.number]) nếu bạn không cần chỉ định danh sách 'số'
KieranPC

23
Dựa trên mẹo trong nhận xét trước (+1), bạn chỉ có thể sử dụng list(df.select_dtypes(include=[np.number]).columns.values) để nhận danh sách tên của các cột số
user799188

76

Bạn có thể sử dụng hàm không có giấy tờ _get_numeric_data()để chỉ lọc các cột số:

df._get_numeric_data()

Thí dụ:

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

Lưu ý rằng đây là "phương pháp riêng" (nghĩa là chi tiết triển khai) và có thể thay đổi hoặc loại bỏ hoàn toàn trong tương lai. Sử dụng thận trọng .


1
Siêu tiện dụng; tài liệu này ở bất cứ đâu? Lo ngại về việc nó biến mất trong các phiên bản trong tương lai và / hoặc không ổn định, vì tiền tố của nó gạch dưới chỉ ra rằng nó có nghĩa là riêng tư.
ijoseph

3
Không, đây không phải là tài liệu ở bất cứ đâu. Tuy nhiên, việc triển khai ở đây , như @ijoseph đã đề cập, tôi sẽ cảnh giác khi sử dụng các phương thức bắt đầu bằng dấu gạch dưới vì chúng ít hơn nhiều so với chi tiết thực hiện. Sử dụng nghĩa đen MỌI câu trả lời khác ngoài điều này.
cs95

Chính xác. Như một cách thực hành tốt nhất, tôi cố gắng sử dụng và chuyển đổi sang càng nhiều phương pháp gọn gàng nhất có thể. Điều này là do sự năng động của gấu trúc. API thay đổi thường xuyên. Đối với các phương pháp không có giấy tờ, nó chỉ đơn giản là liều lĩnh, bất kể nó hữu ích như thế nào.
mik

69

Câu trả lời một dòng đơn giản để tạo một khung dữ liệu mới chỉ với các cột số:

df.select_dtypes(include=np.number)

Nếu bạn muốn tên của các cột số:

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

Mã hoàn chỉnh:

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

Nếu bạn chỉ muốn một loại, bạn không cần lưu nó trong danh sách. Bạn cũng không cần phải chỉ định include=. select_dtypes(np.number)
BallpointBen

Nếu các cột của bạn có dữ liệu số nhưng cũng không có, dtype có thể là 'đối tượng'. Điều này sẽ ép các cột thành số:df.fillna(value=0, inplace=True)
vaughnkoch

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

7
cột datetime là một loại khác datetimethay vì không phải là loại số
Jeru Luke


6

Các mã sau sẽ trả về danh sách tên của các cột số của tập dữ liệu.

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

đây marketing_trainlà tập dữ liệu của tôi và select_dtypes()là chức năng chọn các loại dữ liệu bằng cách sử dụng loại trừ và bao gồm các đối số và cột được sử dụng để tìm nạp tên cột của đầu ra tập dữ liệu của mã trên sẽ như sau:

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

Cảm ơn


4

Đây là một mã đơn giản khác để tìm cột số trong khung dữ liệu gấu trúc,

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

Thích ứng với câu trả lời này , bạn có thể làm

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

Ở đây, np.applymap(np.isreal)cho biết mọi ô trong khung dữ liệu có phải là số hay không và .axis(all=0)kiểm tra xem tất cả các giá trị trong một cột có đúng không và trả về một loạt Booleans có thể được sử dụng để lập chỉ mục các cột mong muốn.


1

Vui lòng xem đoạn mã dưới đây:

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())

Bằng cách này, bạn có thể kiểm tra xem giá trị có phải là số như float và int hoặc các giá trị srting không. câu lệnh if thứ hai được sử dụng để kiểm tra các giá trị chuỗi được đối tượng tham chiếu.


1

Chúng tôi có thể bao gồm và loại trừ các loại dữ liệu theo yêu cầu như dưới đây:

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

Được giới thiệu từ Jupyter Notebook.

Để chọn tất cả các loại số , sử dụng np.numberhoặc'number'

  • Để chọn chuỗi, bạn phải sử dụng objectdtype nhưng lưu ý rằng điều này sẽ trả về tất cả các cột dtype đối tượng

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

  • Để chọn datetimes, sử dụng np.datetime64, 'datetime'hoặc 'datetime64'

  • Để chọn timedeltas, sử dụng np.timedelta64, 'timedelta'hoặc 'timedelta64'

  • Để chọn các loại phân loại Pandas, sử dụng 'category'

  • Để chọn các kiểu dữ liệu Pandas datetimetz, hãy sử dụng 'datetimetz'(mới trong 0.20.0) hoặc `` 'datetime64 [ns, tz]'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.