根据数据类型获取熊猫数据框列的列表


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] 

我想说:这是一个数据框,请给我列出对象类型或日期时间类型的列的列表?

我有一个将数字(Float64)转换为两位小数的函数,并且我想使用此数据框列的特定类型的列表,并通过此函数运行它以将它们全部转换为2dp。

也许:

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

4
当我遇到这个问题时,我正在寻找一种方法来精确地在顶部创建列表。df.dtypes做到这一点。
马丁·托马

访客也可能对这个不同但相关的问题感兴趣,该问题涉及如何在每一列中查找所有对象类型:如何检测熊猫对象列中的子类型?
jpp

Answers:


314

如果您想要某种类型的列的列表,可以使用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
这对于数据质量检查很有用,可以确保列的类型符合预期。
NYCeyes

2
如果所有数据框列都返回object类型,而不论其实际内容如何,则此方法将不起作用
user5359531

2
@ user5359531并不意味着它不起作用,实际上意味着您的DataFrame列未转换为您认为应该的类型,这可能由于多种原因而发生。
马克

6
如果仅按数据类型选择列,则此答案已过时。使用select_dtypes替代
泰德·彼得鲁

之后如何索引此分组数据框?
艾伦·王

110

从pandas v0.14.1开始,您可以利用dtype select_dtypes()选择列

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

使用dtype将为您提供所需列的数据类型:

dataframe['column1'].dtype

如果你想知道的数据类型都一下子列,你可以使用复数dtypedtypes

dataframe.dtypes

1
这应该是公认的答案,它几乎以OP想要的格式打印数据类型。
Abhishek Divekar '17

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

def col_types(x,pd):
itthrill

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

这应该可以解决问题


7

默认情况下使用df.info(verbose=True)哪里df是熊猫数据农场verbose=False


如果表很大,可能会出现内存问题
Koo

4

获取某些dtype列的列表的最直接方法,例如'object':

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

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

这使我的生活变得更加轻松,可以随时尝试生成模式。希望这可以帮助


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

0

我用infer_objects()

Docstring:尝试为对象列推断更好的dtype。

尝试对对象类型化的列进行软转换,而使非对象和不可转换的列保持不变。推理规则与常规Series / DataFrame构造过程中的规则相同。

df.infer_objects().dtypes

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.