получить список столбцов данных панд на основе типа данных

184

Если у меня есть датафрейм со следующими столбцами:

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] 

Я хотел бы иметь возможность сказать: вот кадр данных, дать мне список столбцов, которые имеют тип Object или типа DateTime?

У меня есть функция, которая преобразует числа (Float64) в два десятичных знака, и я хотел бы использовать этот список столбцов данных определенного типа и запустить его через эту функцию, чтобы преобразовать их все в 2dp.

Может быть:

For c in col_list: if c.dtype = "Something"
list[]
List.append(c)?
yoshiserry
источник
4
Когда я пришел к этому вопросу, я искал способ создать именно список сверху. df.dtypesделает это
Мартин Тома
Посетителей также может заинтересовать другой, но связанный с этим вопрос о том, как найти все типы объектов в каждом столбце : как я могу обнаружить подтипы в столбцах объектов панд? ,
JPP

Ответы:

315

Если вам нужен список столбцов определенного типа, вы можете использовать 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
источник
5
Это полезно в качестве проверки качества данных, когда гарантируется, что столбцы соответствуют ожидаемому типу.
NYCeyes
2
это не работает, если все ваши столбцы данных возвращают objectтип, независимо от их фактического содержимого
user5359531
2
@ user5359531 это не означает, что он не работает, это означает, что ваши столбцы DataFrame не были приведены к тому типу, который, как вы думаете, должен быть, что может произойти по разным причинам.
Марк
6
Если вы просто выбираете столбцы по типу данных, то этот ответ устарел. Используйте select_dtypesвместо этого
Тед Петру
Как вы индексируете этот сгруппированный массив данных впоследствии?
Аллен Ван
110

Начиная с pandas v0.14.1, вы можете использовать select_dtypes()для выбора столбцов по 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']
qmorgan
источник
35

Использование dtypeдаст вам тип данных желаемого столбца:

dataframe['column1'].dtype

если вы хотите знать типы данных всех столбцов одновременно , вы можете использовать множественное число dtypeкак dtypes :

dataframe.dtypes
Ашиш Саху
источник
1
Это должен быть принятый ответ, он печатает типы данных практически в том формате, который хочет OP.
Абхишек Дивекарь
1
Вопрос был в том, чтобы перечислить только конкретный тип данных, например, используя, df.select_dtypes(include=['Object','DateTime']).columnsкак описано ниже
DfAC
29

Вы можете использовать логическую маску для атрибута 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

Вы можете посмотреть только на те столбцы с желаемым dtype:

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

Теперь вы можете использовать раунд (или любой другой) и присвоить его обратно:

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
Энди Хейден
источник
Я хотел бы иметь возможность написать функцию, которая принимает имя информационного кадра, а затем возвращает словарь списков, с ключом словаря, являющимся типом данных, и значением, являющимся списком столбцов из информационного кадра, которые этого тип данных.
yoshiserry
def col_types (x, pd):
itthrill
14
list(df.select_dtypes(['object']).columns)

Это должно сделать свое дело

Tanmoy
источник
7

по умолчанию используется df.info(verbose=True)где dfdatafarme для пандverbose=False

Koo
источник
могут быть проблемы с памятью, если таблица большая
Koo
4

Самый прямой способ получить список столбцов определенного dtype, например, «объект»:

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

Например:

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

Чтобы получить все «объектные» столбцы dtype:

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

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

Для всего списка:

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

['C', 'D']   
MLKing
источник
3

Если вы хотите список только столбцов объекта, вы можете сделать:

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

а затем, если вы хотите получить другой список только чисел:

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

источник
0

Я придумал этот три лайнера .

По сути, вот что он делает:

  1. Получите имена столбцов и их соответствующие типы данных.
  2. Я при желании вывести его в 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

Это сделало мою жизнь намного проще, пытаясь создавать схемы на лету. Надеюсь это поможет

geekidharsh
источник
0

для йошисерри;

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
itthrill
источник
0

Я использую infer_objects ()

Docstring: попытаться вывести лучшие dtypes для столбцов объекта.

Пытается выполнить мягкое преобразование столбцов с типом объекта, оставив неизменными необъектные и необратимые столбцы. Правила вывода те же, что и при обычном построении Series / DataFrame.

df.infer_objects().dtypes

как будто
источник