dapatkan daftar kolom bingkai data panda berdasarkan tipe data

184

Jika saya memiliki kerangka data dengan kolom berikut:

1. NAME                                     object
2. On_Time                                      object
3. On_Budget                                    object
4. %actual_hr                                  float64
5. Baseline Start Date                  datetime64[ns]
6. Forecast Start Date                  datetime64[ns] 

Saya ingin mengatakan: ini adalah kerangka data, beri saya daftar kolom yang bertipe Obyek atau bertipe DateTime?

Saya memiliki fungsi yang mengubah angka (Float64) menjadi dua tempat desimal, dan saya ingin menggunakan daftar kolom dataframe ini, dari tipe tertentu, dan menjalankannya melalui fungsi ini untuk mengonversi semuanya menjadi 2dp.

Mungkin:

For c in col_list: if c.dtype = "Something"
list[]
List.append(c)?
yoshiserry
sumber
4
Ketika saya sampai pada pertanyaan ini, saya mencari cara untuk membuat daftar persis di atas. df.dtypesapakah itu.
Martin Thoma
Pengunjung juga mungkin tertarik pada pertanyaan yang berbeda namun terkait ini tentang cara menemukan semua jenis objek dalam setiap kolom : Bagaimana saya bisa mendeteksi subtipe dalam kolom objek panda? .
jpp

Jawaban:

315

Jika Anda ingin daftar kolom dari jenis tertentu, Anda dapat menggunakan groupby:

>>> df = pd.DataFrame([[1, 2.3456, 'c', 'd', 78]], columns=list("ABCDE"))
>>> df
   A       B  C  D   E
0  1  2.3456  c  d  78

[1 rows x 5 columns]
>>> df.dtypes
A      int64
B    float64
C     object
D     object
E      int64
dtype: object
>>> g = df.columns.to_series().groupby(df.dtypes).groups
>>> g
{dtype('int64'): ['A', 'E'], dtype('float64'): ['B'], dtype('O'): ['C', 'D']}
>>> {k.name: v for k, v in g.items()}
{'object': ['C', 'D'], 'int64': ['A', 'E'], 'float64': ['B']}
DSM
sumber
5
Ini berguna sebagai pemeriksaan Kualitas Data, di mana orang memastikan bahwa kolom adalah tipe yang diharapkan.
NYCeyes
2
ini tidak berfungsi jika semua kolom bingkai data Anda kembali objectketik, terlepas dari kontennya yang sebenarnya
user5359531
2
@ user5359531 itu tidak berarti itu tidak berfungsi, itu sebenarnya berarti kolom DataFrame Anda tidak dilemparkan ke tipe yang Anda pikir seharusnya, yang dapat terjadi karena berbagai alasan.
Marc
6
Jika Anda hanya memilih kolom berdasarkan tipe data, maka jawaban ini sudah usang. Gunakan select_dtypessebagai gantinya
Ted Petrou
Bagaimana Anda mengindeks kerangka data yang dikelompokkan ini setelahnya?
Allen Wang
110

Pada panda v0.14.1, Anda dapat memanfaatkan select_dtypes() untuk memilih kolom berdasarkan

In [2]: df = pd.DataFrame({'NAME': list('abcdef'),
    'On_Time': [True, False] * 3,
    'On_Budget': [False, True] * 3})

In [3]: df.select_dtypes(include=['bool'])
Out[3]:
  On_Budget On_Time
0     False    True
1      True   False
2     False    True
3      True   False
4     False    True
5      True   False

In [4]: mylist = list(df.select_dtypes(include=['bool']).columns)

In [5]: mylist
Out[5]: ['On_Budget', 'On_Time']
qmorgan
sumber
35

Menggunakan dtypeakan memberi Anda tipe data kolom yang diinginkan:

dataframe['column1'].dtype

jika Anda ingin mengetahui tipe data dari semua kolom sekaligus , Anda dapat menggunakan bentuk jamak dtypesebagai dtypes :

dataframe.dtypes
Ashish Sahu
sumber
1
Ini harus menjadi jawaban yang diterima, ia mencetak tipe data dalam hampir persis format yang diinginkan OP.
Abhishek Divekar
1
Pertanyaannya adalah tentang daftar hanya tipe data spesifik misalnya menggunakan df.select_dtypes(include=['Object','DateTime']).columnsseperti yang dibahas di bawah ini
DfAC
29

Anda bisa menggunakan topeng boolean pada atribut dtypes:

In [11]: df = pd.DataFrame([[1, 2.3456, 'c']])

In [12]: df.dtypes
Out[12]: 
0      int64
1    float64
2     object
dtype: object

In [13]: msk = df.dtypes == np.float64  # or object, etc.

In [14]: msk
Out[14]: 
0    False
1     True
2    False
dtype: bool

Anda dapat melihat kolom-kolom itu hanya dengan tipe yang diinginkan:

In [15]: df.loc[:, msk]
Out[15]: 
        1
0  2.3456

Sekarang Anda bisa menggunakan round (atau apa pun) dan mengembalikannya:

In [16]: np.round(df.loc[:, msk], 2)
Out[16]: 
      1
0  2.35

In [17]: df.loc[:, msk] = np.round(df.loc[:, msk], 2)

In [18]: df
Out[18]: 
   0     1  2
0  1  2.35  c
Andy Hayden
sumber
Saya ingin dapat menulis fungsi yang mengambil nama dataframe, dan kemudian mengembalikan kamus daftar, dengan kunci kamus menjadi datatype dan nilainya menjadi daftar kolom dari dataframe yang dari itu tipe data.
yoshiserry
def col_types (x, pd):
itthrill
14
list(df.select_dtypes(['object']).columns)

Ini harus melakukan trik

Tanmoy
sumber
7

gunakan di df.info(verbose=True)mana dfadalah panda datafarme, secara defaultverbose=False

Koo
sumber
mungkin ada masalah memori jika meja besar
Koo
4

Cara paling langsung untuk mendapatkan daftar kolom dari tipe tertentu misalnya 'objek':

df.select_dtypes(include='object').columns

Sebagai contoh:

>>df = pd.DataFrame([[1, 2.3456, 'c', 'd', 78]], columns=list("ABCDE"))
>>df.dtypes

A      int64
B    float64
C     object
D     object
E      int64
dtype: object

Untuk mendapatkan semua kolom tipe objek ':

>>df.select_dtypes(include='object').columns

Index(['C', 'D'], dtype='object')

Untuk daftar saja:

>>list(df.select_dtypes(include='object').columns)

['C', 'D']   
MLKing
sumber
3

Jika Anda ingin daftar hanya kolom objek yang dapat Anda lakukan:

non_numerics = [x for x in df.columns \
                if not (df[x].dtype == np.float64 \
                        or df[x].dtype == np.int64)]

dan kemudian jika Anda ingin mendapatkan daftar numerik lainnya:

numerics = [x for x in df.columns if x not in non_numerics]

sumber
0

Saya datang dengan tiga liner ini .

Pada dasarnya, inilah fungsinya:

  1. Ambil nama kolom dan tipe datanya masing-masing.
  2. Saya secara opsional mengeluarkannya ke csv.

inp = pd.read_csv('filename.csv') # read input. Add read_csv arguments as needed
columns = pd.DataFrame({'column_names': inp.columns, 'datatypes': inp.dtypes})
columns.to_csv(inp+'columns_list.csv', encoding='utf-8') # encoding is optional

Ini membuat hidup saya jauh lebih mudah dalam mencoba membuat skema dengan cepat. Semoga ini membantu

geekidharsh
sumber
0

untuk yoshiserry;

def col_types(x,pd):
    dtypes=x.dtypes
    dtypes_col=dtypes.index
    dtypes_type=dtypes.value
    column_types=dict(zip(dtypes_col,dtypes_type))
    return column_types
itu menyenangkan
sumber
0

Saya menggunakan infer_objects ()

Docstring: Mencoba menyimpulkan dtypes yang lebih baik untuk kolom objek.

Mencoba konversi lunak pada kolom objek-dtyped, meninggalkan kolom non-objek dan tidak dapat dikonversi. Aturan inferensi sama dengan selama konstruksi Series / DataFrame normal.

df.infer_objects().dtypes

seolah-olah
sumber