lấy danh sách các cột dataframe dựa trên kiểu dữ liệu


182

Nếu tôi có một khung dữ liệu với các cột sau:

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] 

Tôi muốn có thể nói: đây là một khung dữ liệu, cho tôi một danh sách các cột thuộc loại Object hoặc loại DateTime?

Tôi có một hàm chuyển đổi số (Float64) thành hai vị trí thập phân và tôi muốn sử dụng danh sách các cột khung dữ liệu này, thuộc một loại cụ thể và chạy nó qua hàm này để chuyển đổi tất cả thành 2dp.

Có lẽ:

For c in col_list: if c.dtype = "Something"
list[]
List.append(c)?

4
Khi tôi đến câu hỏi này, tôi đang tìm cách tạo ra chính xác danh sách ở trên cùng. df.dtypeslàm điều đó
Martin Thoma

Khách truy cập cũng có thể quan tâm đến câu hỏi khác nhau nhưng có liên quan này về cách tìm tất cả các loại đối tượng trong mỗi cột : Làm cách nào tôi có thể phát hiện các kiểu con trong các cột đối tượng gấu trúc? .
jpp

Câu trả lời:


313

Nếu bạn muốn một danh sách các cột thuộc một loại nhất định, bạn có thể sử dụng 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']}

5
Điều này hữu ích khi kiểm tra Chất lượng Dữ liệu, trong đó người ta đảm bảo rằng các cột thuộc loại mà người ta mong đợi.
NYCeyes

2
điều này không hoạt động nếu tất cả các cột khung dữ liệu của bạn đang trả về objectloại, bất kể nội dung thực tế của chúng
user5359531

2
@ user5359531 điều đó không có nghĩa là nó không hoạt động, điều đó thực sự có nghĩa là các cột DataFrame của bạn không được chuyển sang loại mà bạn nghĩ là chúng có thể xảy ra vì nhiều lý do.
Marc

6
Nếu bạn chỉ chọn các cột theo loại dữ liệu, thì câu trả lời này đã lỗi thời. Sử dụng select_dtypesthay thế
Ted Petrou

Làm thế nào để bạn lập chỉ mục khung dữ liệu được nhóm này sau đó?
Allen Wang

109

Kể từ gấu trúc v0.14.1, bạn có thể sử dụng select_dtypes()để chọn các cột theo dtype

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

35

Sử dụng dtypesẽ cung cấp cho bạn loại dữ liệu của cột mong muốn:

dataframe['column1'].dtype

nếu bạn muốn biết các loại dữ liệu của tất cả các cột cùng một lúc , bạn có thể sử dụng số nhiều dtypedưới dạng dtypes :

dataframe.dtypes

1
Đây phải là câu trả lời được chấp nhận, nó in các kiểu dữ liệu gần như chính xác định dạng mà OP muốn.
Abhishek Divekar

1
Câu hỏi là về việc chỉ liệt kê kiểu dữ liệu cụ thể, ví dụ như sử dụng df.select_dtypes(include=['Object','DateTime']).columnsnhư được thảo luận dưới đây
DfAC

29

Bạn có thể sử dụng mặt nạ boolean trên thuộc tính 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

Bạn chỉ có thể nhìn vào các cột với dtype mong muốn:

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

Bây giờ bạn có thể sử dụng vòng (hoặc bất cứ điều gì) và gán lại:

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

Tôi rất thích có thể viết một hàm lấy tên của khung dữ liệu và sau đó trả về một từ điển danh sách, với khóa từ điển là kiểu dữ liệu và giá trị là danh sách các cột từ khung dữ liệu đó là loại dữ liệu.
yoshiserry

def col_types (x, pd):
itthrill

14
list(df.select_dtypes(['object']).columns)

cái này cần phải dùng mẹo


7

sử dụng df.info(verbose=True)ở đâu dflà một datafarme gấu trúc, theo mặc địnhverbose=False


có thể có vấn đề về bộ nhớ nếu bảng lớn
Koo

4

Cách trực tiếp nhất để có được danh sách các cột của dtype nhất định, ví dụ: 'object':

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

Ví dụ:

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

Để có được tất cả các cột dtype 'đối tượng':

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

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

Đối với chỉ danh sách:

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

['C', 'D']   

3

Nếu bạn muốn một danh sách chỉ các cột đối tượng bạn có thể làm:

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

và sau đó nếu bạn muốn lấy một danh sách khác chỉ có các số:

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

0

Tôi đã đưa ra ba lót này .

Về cơ bản, đây là những gì nó làm:

  1. Lấy tên cột và kiểu dữ liệu tương ứng của chúng.
  2. Tôi tùy ý đưa nó ra một 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

Điều này làm cho cuộc sống của tôi dễ dàng hơn nhiều trong việc cố gắng tạo ra các lược đồ một cách nhanh chóng. Hi vọng điêu nay co ich


0

cho 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

0

Tôi sử dụng infer_objects ()

Docopes: Cố gắng suy ra các dtypes tốt hơn cho các cột đối tượng.

Cố gắng chuyển đổi mềm các cột được nhúng đối tượng, giữ nguyên các cột không đối tượng và không thể chuyển đổi. Các quy tắc suy luận giống như trong quá trình xây dựng Sê-ri / Khung dữ liệu thông thường.

df.infer_objects().dtypes

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.