Pandas'ta sayısal sütunları nasıl bulurum?


121

Diyelim ki dfbir panda DataFrame. Sayısal türdeki tüm sütunları bulmak istiyorum. Gibi bir şey:

isNumeric = is_numeric(df)

Var dtypeolan object, ancak tüm öğeleri sayısal olan bir sütunun sayısal olarak sayılıp sayılmayacağını belirtmelisiniz . Hayır ise, daha hızlı olduğu için Hanan'ın cevabını alın. Aksi takdirde benimkini al.
FooBar

Sadece df.describe (). Sütunlarını denerseniz ne olur. Sonra onu bir değişkene atayın.
coldy

Yanıtlar:


146

select_dtypesDataFrame yöntemini kullanabilirsiniz . İki parametre içerir ve hariç tutar. Yani isNumeric şöyle görünür:

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

newdf = df.select_dtypes(include=numerics)

94
Bir 'sayısal' listesi belirtmeniz gerekmiyorsa, df.select_dtypes (include = [np.number]) kullanabilirsiniz
KieranPC

23
Önceki yorumun (+1) list(df.select_dtypes(include=[np.number]).columns.values)
ipucuna dayanarak

76

Belgelenmemiş işlevi _get_numeric_data()yalnızca sayısal sütunları filtrelemek için kullanabilirsiniz :

df._get_numeric_data()

Misal:

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

Bunun "özel bir yöntem" (yani bir uygulama ayrıntısı) olduğunu ve gelecekte değişikliğe veya tamamen kaldırılabileceğini unutmayın. Dikkatli kullanın .


1
Çok kullanışlı; bu herhangi bir yerde belgelendi mi? Önek alt çizgisi özel olması gerektiğini gösterdiğinden
ijoseph

3
Hayır, bu hiçbir yerde belgelenmedi. Bununla birlikte, uygulama burada , @ ijoseph'in bahsettiği gibi, uygulama ayrıntılarından biraz daha fazla oldukları için alt çizgilerle başlayan yöntemleri kullanmaktan çekinirim. Bunun dışında kelimenin tam anlamıyla HERHANGİ BİR yanıt kullanın.
cs95

Kesinlikle. En iyi uygulama olarak, olabildiğince çok sayıda numpy yöntemi kullanmaya ve dönüştürmeye çalışıyorum. Bu pandaların dinamizminden kaynaklanıyor. API sık sık değişir. Belgelenmemiş yöntemler için, ne kadar yararlı olursa olsun, tamamen pervasızdır.
mik

69

Yalnızca sayısal sütunlarla yeni bir veri çerçevesi oluşturmak için basit tek satırlık yanıt:

df.select_dtypes(include=np.number)

Sayısal sütunların adlarını istiyorsanız:

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

Tam kod:

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

Yalnızca bir tür istiyorsanız, onu bir listede saklamanıza gerek yoktur. Ayrıca belirtmenize de gerek yok include=. select_dtypes(np.number)
BallpointBen

Sütunlarınız sayısal verilere sahipse ancak aynı zamanda Hiçbiri varsa, dtype 'nesne' olabilir. Bu, sütunları sayısal hale df.fillna(value=0, inplace=True)
getirecek

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

7
tarihsaat sütunları, datetimesayısal türler olmadığından farklı bir türdür
Jeru Luke, 14'17


6

Aşağıdaki kodlar, bir veri kümesinin sayısal sütunlarının adlarının listesini döndürür.

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

İşte marketing_trainbenim veri setim ve select_dtypes()fonksiyon dışlama ve içerme bağımsız değişkenlerini kullanarak veri türlerini seçmek için kullanılır ve sütunlar veri kümesinin sütun adını almak için kullanılır, yukarıdaki kodun çıktısı aşağıdaki olacaktır:

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

Teşekkürler


4

Bu, pandalar veri çerçevesinde sayısal sütun bulmak için başka bir basit koddur.

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

Bu cevabı uyarlayarak yapabilirsin

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

Burada, np.applymap(np.isreal)veri çerçevesindeki her hücrenin sayısal olup olmadığını gösterir ve .axis(all=0)bir sütundaki tüm değerlerin True olup olmadığını kontrol eder ve istenen sütunları dizine eklemek için kullanılabilecek bir dizi Boole döndürür.


1

Lütfen aşağıdaki koda bakın:

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

Bu şekilde, değerin float ve int veya srting değerleri gibi sayısal olup olmadığını kontrol edebilirsiniz. ikinci if ifadesi, nesne tarafından başvurulan dizge değerlerini kontrol etmek için kullanılır.


1

Veri türlerini aşağıdaki gereksinime göre dahil edebilir ve hariç tutabiliriz:

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

Jupyter Notebook'tan alıntılanmıştır.

Tüm sayısal türleri seçmek için np.numberveya'number'

  • Dizeleri seçmek için objectdtype kullanmanız gerekir, ancak bunun tüm nesne dtype sütunlarını döndüreceğini unutmayın.

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

  • Tarih zamanlarını seçmek için np.datetime64, 'datetime'veya 'datetime64'

  • Zaman çizelgelerini seçmek için np.timedelta64, 'timedelta'veya 'timedelta64'

  • Pandaların kategorik tiplerini seçmek için şunu kullanın: 'category'

  • Pandas datetimetz dtype'lerini seçmek için 'datetimetz'(0.20.0'da yeni) veya "'datetime64 [ns, tz]' kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.