จะตรวจสอบได้อย่างไรว่าคอลัมน์ / ตัวแปรเป็นตัวเลขหรือไม่ใน Pandas / NumPy?


91

มีวิธีที่ดีกว่าในการพิจารณาว่าตัวแปรในPandasและ / หรือNumPyเป็นnumericหรือไม่?

ฉันมีการกำหนดตัวเองdictionaryด้วยdtypesเป็นคีย์และnumeric/ notเป็นค่า


16
dtype.kind in 'biufc'คุณสามารถตรวจสอบ
ไจ

1
ความคิดเห็นด้านบนนี้โพสต์โดย Jaime นั้นง่ายกว่าความคิดเห็นด้านล่างและดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบ ...... ขอบคุณ
hfrog713

คำตอบ:


102

ในpandas 0.20.2คุณสามารถทำได้:

import pandas as pd
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype

df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1.0, 2.0, 3.0]})

is_string_dtype(df['A'])
>>>> True

is_numeric_dtype(df['B'])
>>>> True

ฉันจะบอกว่านี่เป็นวิธีการแก้ปัญหาที่หรูหรากว่า ขอบคุณ
ราวกับว่า

85

คุณสามารถใช้np.issubdtypeเพื่อตรวจสอบว่า dtype เป็นประเภทย่อยของnp.number. ตัวอย่าง:

np.issubdtype(arr.dtype, np.number)  # where arr is a numpy array
np.issubdtype(df['X'].dtype, np.number)  # where df['X'] is a pandas Series

งานนี้ dtypes numpy แต่ล้มเหลวสำหรับประเภทหมีแพนด้าที่เฉพาะเจาะจงเช่น pd.Categorical โทมัสตั้งข้อสังเกต หากคุณใช้is_numeric_dtypeฟังก์ชันการจัดหมวดหมู่จากแพนด้าเป็นทางเลือกที่ดีกว่า np.issubdtype

df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 
                   'C': [1j, 2j, 3j], 'D': ['a', 'b', 'c']})
df
Out: 
   A    B   C  D
0  1  1.0  1j  a
1  2  2.0  2j  b
2  3  3.0  3j  c

df.dtypes
Out: 
A         int64
B       float64
C    complex128
D        object
dtype: object

np.issubdtype(df['A'].dtype, np.number)
Out: True

np.issubdtype(df['B'].dtype, np.number)
Out: True

np.issubdtype(df['C'].dtype, np.number)
Out: True

np.issubdtype(df['D'].dtype, np.number)
Out: False

สำหรับหลายคอลัมน์คุณสามารถใช้ np.vectorize:

is_number = np.vectorize(lambda x: np.issubdtype(x, np.number))
is_number(df.dtypes)
Out: array([ True,  True,  True, False], dtype=bool)

และสำหรับการคัดเลือกตอนนี้แพนด้ามีselect_dtypes:

df.select_dtypes(include=[np.number])
Out: 
   A    B   C
0  1  1.0  1j
1  2  2.0  2j
2  3  3.0  3j

1
ดูเหมือนว่าจะใช้งานได้ไม่น่าเชื่อถือกับ DataFrames ของแพนด้าเนื่องจากอาจส่งคืนหมวดหมู่ที่ไม่รู้จักเป็นจำนวนมากเช่น "หมวดหมู่" จากนั้น Numpy จะพ่น "TypeError: data type not understand"
Thomas

23

จากคำตอบของ @ jaime ในความคิดเห็นคุณต้องตรวจสอบ.dtype.kindคอลัมน์ที่สนใจ ตัวอย่างเช่น;

>>> import pandas as pd
>>> df = pd.DataFrame({'numeric': [1, 2, 3], 'not_numeric': ['A', 'B', 'C']})
>>> df['numeric'].dtype.kind in 'biufc'
>>> True
>>> df['not_numeric'].dtype.kind in 'biufc'
>>> False

NB ความหมายของbiufc: bbool, iint (ลงนาม), uint ที่ไม่ได้ลงนาม, ffloat, ccomplex ดูhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind


3
นี่คือรายการประเภท dtype ทั้งหมด [1] ตัวพิมพ์เล็กใช้uสำหรับจำนวนเต็มที่ไม่ได้ลงชื่อ ตัวพิมพ์ใหญ่ใช้Uสำหรับ Unicode [1]: docs.scipy.org/doc/numpy/reference/generated/…
cbarrick


4

นี่เป็นวิธีการหลอกภายในเพื่อส่งคืนเฉพาะข้อมูลประเภทตัวเลข

In [27]: df = DataFrame(dict(A = np.arange(3), 
                             B = np.random.randn(3), 
                             C = ['foo','bar','bah'], 
                             D = Timestamp('20130101')))

In [28]: df
Out[28]: 
   A         B    C                   D
0  0 -0.667672  foo 2013-01-01 00:00:00
1  1  0.811300  bar 2013-01-01 00:00:00
2  2  2.020402  bah 2013-01-01 00:00:00

In [29]: df.dtypes
Out[29]: 
A             int64
B           float64
C            object
D    datetime64[ns]
dtype: object

In [30]: df._get_numeric_data()
Out[30]: 
   A         B
0  0 -0.667672
1  1  0.811300
2  2  2.020402

ใช่ฉันพยายามคิดว่าพวกเขาทำอย่างนั้นได้อย่างไร อาจมีคนคาดหวังว่าฟังก์ชัน IsNumeric ภายในจะทำงานต่อคอลัมน์ ... แต่ยังไม่พบในรหัส
user2808117

คุณสามารถใช้สิ่งนี้ต่อคอลัมน์ แต่ง่ายกว่ามากในการตรวจสอบ dtype ในเหตุการณ์ใด ๆ การดำเนินการแพนด้าจะไม่รวมค่าที่ไม่ใช่ตัวเลขเมื่อจำเป็น คุณพยายามจะทำอะไร?
Jeff

4

ลองตรวจสอบประเภทสำหรับค่าใดค่าหนึ่งในคอลัมน์ได้อย่างไร? เรามีสิ่งนี้เสมอ:

isinstance(x, (int, long, float, complex))

เมื่อฉันพยายามตรวจสอบประเภทข้อมูลสำหรับคอลัมน์ในดาต้าเฟรมด้านล่างฉันจะได้รับมันเป็น 'วัตถุ' และไม่ใช่ประเภทตัวเลขที่ฉันคาดหวัง:

df = pd.DataFrame(columns=('time', 'test1', 'test2'))
for i in range(20):
    df.loc[i] = [datetime.now() - timedelta(hours=i*1000),i*10,i*100]
df.dtypes

time     datetime64[ns]
test1            object
test2            object
dtype: object

เมื่อฉันทำสิ่งต่อไปนี้ดูเหมือนว่าจะให้ผลลัพธ์ที่ถูกต้อง:

isinstance(df['test1'][len(df['test1'])-1], (int, long, float, complex))

ผลตอบแทน

True

1

คุณยังสามารถลอง:

df_dtypes = np.array(df.dtypes)
df_numericDtypes= [x.kind in 'bifc' for x in df_dtypes]

ส่งคืนรายการบูลีน: Trueถ้าเป็นตัวเลขFalseถ้าไม่ใช่


1

เพื่อเพิ่มคำตอบอื่น ๆ ทั้งหมดเรายังสามารถใช้df.info()เพื่อรับชนิดข้อมูลของแต่ละคอลัมน์ได้


1

คุณสามารถตรวจสอบว่าคอลัมน์ที่ระบุมีค่าตัวเลขหรือไม่โดยใช้ dtypes

numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']

หมายเหตุ: "O" ควรเป็นเงินทุน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.