Python 为dataframe中的所有列提取显式类型

Python 为dataframe中的所有列提取显式类型,python,python-3.x,pandas,dictionary,Python,Python 3.x,Pandas,Dictionary,我有一个数据框,看起来像: acquisition_date conductivity manufacturer number_bought price_per_unit runtime 0 05/25/2008 06:20 PM 115.372339 555-timer 1 9.909869 685.378635 1 07/05/2008 01:58 PM 96.981356 diode 6 11.673483 1

我有一个数据框,看起来像:

acquisition_date    conductivity    manufacturer    number_bought   price_per_unit  runtime
0   05/25/2008 06:20 PM     115.372339  555-timer   1   9.909869    685.378635
1   07/05/2008 01:58 PM     96.981356   diode   6   11.673483   1020.772530
2   03/25/2008 08:52 AM     103.809491  resistor    7   9.879431    910.086424
3   10/31/2008 05:28 PM     95.805199   transistor  5   10.097940   912.137440
4   03/17/2008 06:58 PM     98.447452   thermistor  0   12.280878   1277.008237
其中
日期
包含
时间戳
制造商
包含
字符串
数据类型。我想逐列浏览dataframe并创建一个字典,其键是数据类型,其值是具有给定数据类型的列

这就是我现在正在做的:

g = dframe.columns.to_series().groupby(dframe.dtypes).groups
data_types = {k.name: v for k, v in g.items()}
数据类型
如下所示:

{'float64': Index(['conductivity', 'price_per_unit', 'runtime'], dtype='object'),
 'int64': Index(['number_bought'], dtype='object'),
 'object': Index(['acquisition_date', 'manufacturer'], dtype='object')}
其中,
采集日期
制造商
不被视为
时间戳
字符串
,而是被视为
对象
。有没有一种方法可以将
时间戳
字符串
和其他可能的数据类型包含在此目录中

编辑:只是为了确保我清楚地知道我在问什么。我想修改上述代码,以提供:

{'float64': Index(['conductivity', 'price_per_unit', 'runtime'], dtype='object'),
 'int64': Index(['number_bought'], dtype='object'),
 'timestamp': Index(['acquisition_date'], dtype='object'),
 'string': Index(['manufacturer'], dtype='object')}

您可以使用df.dtypes获取列的数据类型,然后可以创建一个字典,使用对象作为键,使用列作为值

df1.acquisition_date = pd.to_datetime(df1.acquisition_date)
dict([(i.name,df1.dtypes[df1.dtypes==i].index) for i in df1.dtypes.unique()])
输出:


有两点值得注意:

  • 如果当前包含
    object
    dtype,则需要将包含日期的序列显式转换为
    datetime
  • 没有
    string
    dtype这样的东西。熊猫使用
    object
    dtype保存任意Python对象
  • 因此,您可以使用
    pd.to_datetime
    ,这假设
    object
    dtype将只包含字符串。对此的正确检查必须单独检查每个值,这是昂贵且不可取的。下面是一个演示:

    df = pd.DataFrame({'A': pd.to_datetime(['2018-01-01', '2018-11-30']),
                       'B': [4352.123, 5364.1],
                       'C': [423, 2134],
                       'D': ['SomeString', 'AnotherString'],
                       'E': [653.213, 764.1234],
                       'F': [True, False]})
    
    g = df.columns.to_series().groupby(df.dtypes).groups
    
    data_types = {k.name: v for k, v in g.items()}
    
    结果:

    {'bool': Index(['F'], dtype='object'),
     'datetime64[ns]': Index(['A'], dtype='object'),
     'float64': Index(['B', 'E'], dtype='object'),
     'int64': Index(['C'], dtype='object'),
     'object': Index(['D'], dtype='object')}
    
    注意:您还可以使用:


    我不明白你的意思。我只想让上面的代码能够将“object”类拆分为两个不同的类,即“string”和“timestamp”。@qbix是这样的吗?如果需要,可以更改datetime64键
    {'bool': Index(['F'], dtype='object'),
     'datetime64[ns]': Index(['A'], dtype='object'),
     'float64': Index(['B', 'E'], dtype='object'),
     'int64': Index(['C'], dtype='object'),
     'object': Index(['D'], dtype='object')}
    
    data_types = {i: df.select_dtypes(include=[i]).columns for i in df.dtypes}