在Pandas中创建空数据框,指定列类型

时间:2016-04-06 21:00:40

标签: python pandas

我正在尝试使用索引创建一个空数据框并指定列类型。我这样做的方法如下:

df = pd.DataFrame(index=['pbp'],columns=['contract',
                                         'state_and_county_code',
                                         'state',
                                         'county',
                                         'starting_membership',
                                         'starting_raw_raf',
                                         'enrollment_trend',
                                         'projected_membership',
                                         'projected_raf'],
                                dtype=['str', 'str', 'str', 'str', 'int', 'float', 'float', 'int', 'float'])

但是,我收到以下错误,

TypeError: data type not understood

这是什么意思?

12 个答案:

答案 0 :(得分:15)

这真的闻起来像个臭虫。

这是另一个(更简单的)解决方案。

import pandas as pd
import numpy as np

def df_empty(columns, dtypes, index=None):
    assert len(columns)==len(dtypes)
    df = pd.DataFrame(index=index)
    for c,d in zip(columns, dtypes):
        df[c] = pd.Series(dtype=d)
    return df

df = df_empty(['a', 'b'], dtypes=[np.int64, np.int64])
print(list(df.dtypes)) # int64, int64

答案 1 :(得分:8)

只是一句话。

您可以使用np.dtype来解决类型错误:

pd.DataFrame(index = ['pbp'], columns = ['a','b'], dtype = np.dtype([('str','float')]))

但你得到了:

NotImplementedError: compound dtypes are not implementedin the DataFrame constructor

答案 2 :(得分:5)

您可以这样做

import numpy
import pandas

dtypes = numpy.dtype([
          ('a', str),
          ('b', int),
          ('c', float),
          ('d', numpy.datetime64),
          ])
data = numpy.empty(0, dtype=dtypes)
df = pandas.DataFrame(data)

答案 3 :(得分:4)

在遇到同样的问题后我发现了这个问题。我更喜欢以下解决方案(Python 3),用无索引创建一个空的DataFrame。

import numpy as np
import pandas as pd

def make_empty_typed_df(dtype):
    tdict = np.typeDict
    types = tuple(tdict.get(t, t) for (_, t, *__) in dtype)
    if any(t == np.void for t in types):
        raise NotImplementedError('Not Implemented for columns of type "void"')
    return pd.DataFrame.from_records(np.array([tuple(t() for t in types)], dtype=dtype)).iloc[:0, :]

测试出来......

from itertools import chain

dtype = [('col%d' % i, t) for i, t in enumerate(chain(np.typeDict, set(np.typeDict.values())))]
dtype = [(c, t) for (c, t) in dtype if (np.typeDict.get(t, t) != np.void) and not isinstance(t, int)]

print(make_empty_typed_df(dtype))

<强>输出:

Empty DataFrame

Columns: [col0, col6, col16, col23, col24, col25, col26, col27, col29, col30, col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, col51, col52, col53, col54, col55, col56, col57, col58, col60, col61, col62, col63, col64, col65, col66, col67, col68, col69, col70, col71, col72, col73, col74, col75, col76, col77, col78, col79, col80, col81, col82, col83, col84, col85, col86, col87, col88, col89, col90, col91, col92, col93, col95, col96, col97, col98, col99, col100, col101, col102, col103, col104, col105, col106, col107, col108, col109, col110, col111, col112, col113, col114, col115, col117, col119, col120, col121, col122, col123, col124, ...]
Index: []

[0 rows x 146 columns]

数据类型......

print(make_empty_typed_df(dtype).dtypes)

<强>输出:

col0      timedelta64[ns]
col6               uint16
col16              uint64
col23                int8
col24     timedelta64[ns]
col25                bool
col26           complex64
col27               int64
col29             float64
col30                int8
col31             float16
col32              uint64
col33               uint8
col34              object
col35          complex128
col36               int64
col37               int16
col38               int32
col39               int32
col40             float16
col41              object
col42              uint64
col43              object
col44               int16
col45              object
col46               int64
col47               int16
col48              uint32
col49              object
col50              uint64
               ...       
col144              int32
col145               bool
col146            float64
col147     datetime64[ns]
col148             object
col149             object
col150         complex128
col151    timedelta64[ns]
col152              int32
col153              uint8
col154            float64
col156              int64
col157             uint32
col158             object
col159               int8
col160              int32
col161             uint64
col162              int16
col163             uint32
col164             object
col165     datetime64[ns]
col166            float32
col167               bool
col168            float64
col169         complex128
col170            float16
col171             object
col172             uint16
col173          complex64
col174         complex128
dtype: object

添加索引变得棘手,因为对于大多数数据类型没有真正的缺失值,因此它们最终会被转换为具有本机缺失值的其他类型(例如,int被强制转换为{{ 1}} s或float s),但如果您拥有已指定类型的完整数据,则可以随时根据需要插入行,并且您的类型将得到尊重。这可以通过以下方式完成:

object

再次,正如@Hun指出的那样,这不是Pandas打算如何使用。

答案 4 :(得分:3)

pandas不提供纯整数列。您可以使用float列并根据需要将该列转换为整数,也可以将其视为对象。你想要实现的不是pandas应该被使用的方式。但是,如果你真的真的想要这样,你可以通过这样做来解决TypeError消息。

df1 =  pd.DataFrame(index=['pbp'], columns=['str1','str2','str2'], dtype=str)
df2 =  pd.DataFrame(index=['pbp'], columns=['int1','int2'], dtype=int)
df3 =  pd.DataFrame(index=['pbp'], columns=['flt1','flt2'], dtype=float)
df = pd.concat([df1, df2, df3], axis=1)

    str1 str2 str2 int1 int2  flt1  flt2
pbp  NaN  NaN  NaN  NaN  NaN   NaN   NaN

您可以根据需要重新排列col顺序。但同样,这不是应该使用大熊猫的方式。

 df.dtypes
str1     object
str2     object
str2     object
int1     object
int2     object
flt1    float64
flt2    float64
dtype: object

请注意,int被视为对象。

答案 5 :(得分:2)

您可以通过将字典传递到DataFrame构造函数来完成此操作:

$query = "DELETE  FROM wishList
     WHERE userID_FK = {$_SESSION['user_id']}
     AND itemName = {$row['itemName']}";

这将正确为您提供如下所示的数据框:

df = pd.DataFrame(index=['pbp'],
                  data={'contract' : np.full(1, "", dtype=str),
                        'starting_membership' : np.full(1, np.nan, dtype=float),
                        'projected_membership' : np.full(1, np.nan, dtype=int)
                       }
                 )

使用dtypes:

     contract  projected_membership   starting_membership
pbp     ""             NaN           -9223372036854775808

那就是说,有两点需要注意:

1)contract object projected_membership float64 starting_membership int64 实际上并不是DataFrame列可以处理的类型;相反,它回到了一般情况str。它仍然可以正常工作。

2)为什么不在object下看到NaN?好吧,starting_membership仅定义为花车;没有&#34;无&#34;整数的值,因此它将NaN转换为整数。如果您想要一个不同的默认值,可以在np.NaN调用中更改它。

答案 6 :(得分:2)

这是一个古老的问题,但是我没有一个可靠的答案(尽管@eric_g非常接近)。

您只需要创建一个包含字典key:value对列表的空数据框。键是您的列名,值是一个空数据类型。

因此,在您的示例数据集中,其外观如下:

df = pd.DataFrame(,columns=[{'contract':'',
                              'state_and_county_code':'',
                              'state':'',
                              'county':'',
                              'starting_membership':int(),
                              'starting_raw_raf':float(),
                              'enrollment_trend':float(),
                              'projected_membership':int(),
                              'projected_raf':float(),
                              'pbp':int() #just guessing on this data type
                                      }]).set_index=("pbp")

答案 7 :(得分:1)

我发现对我来说,最简单的解决方法是为每个单独的列串联一个空序列列表:

import pandas as pd

columns = ['contract',
           'state_and_county_code',
           'state',
           'county',
           'starting_membership',
           'starting_raw_raf',
           'enrollment_trend',
           'projected_membership',
           'projected_raf']
dtype = ['str', 'str', 'str', 'str', 'int', 'float', 'float', 'int', 'float']
df = pd.concat([pd.Series(name=col, dtype=dt) for col, dt in zip(columns, dtype)], axis=1)
df.info()
# <class 'pandas.core.frame.DataFrame'>
# Index: 0 entries
# Data columns (total 9 columns):
# contract                 0 non-null object
# state_and_county_code    0 non-null object
# state                    0 non-null object
# county                   0 non-null object
# starting_membership      0 non-null int32
# starting_raw_raf         0 non-null float64
# enrollment_trend         0 non-null float64
# projected_membership     0 non-null int32
# projected_raf            0 non-null float64
# dtypes: float64(3), int32(2), object(4)
# memory usage: 0.0+ bytes

答案 8 :(得分:1)

从您的示例中获取列表列和 dtype,您可以执行以下操作:

cdt={i[0]: i[1] for i in zip(columns, dtype)}    # make column type dict
pdf=pd.DataFrame(columns=list(cdt))    # create empty dataframe
pdf=pdf.astype(cdt)                    # set desired column types

DataFrame 文档说在构造函数调用中只允许使用一个 dtype。

答案 9 :(得分:0)

我的解决方案(不设置索引)是使用列名初始化数据帧并使用astype()方法指定数据类型。

df = pd.DataFrame(columns=['contract',
                     'state_and_county_code',
                     'state',
                     'county',
                     'starting_membership',
                     'starting_raw_raf',
                     'enrollment_trend',
                     'projected_membership',
                     'projected_raf'])
df = df.astype( dtype={'contract' : str, 
                 'state_and_county_code': str,
                 'state': str,
                 'county': str,
                 'starting_membership': int,
                 'starting_raw_raf': float,
                 'enrollment_trend': float,
                 'projected_membership': int,
                 'projected_raf': float})

答案 10 :(得分:0)

您可以使用以下内容:

df = pd.DataFrame({'a': pd.Series([], dtype='int'),
                   'b': pd.Series([], dtype='str'),
                   'c': pd.Series([], dtype='float')})

然后,如果您致电df,就拥有

>>> df 
Empty DataFrame 
Columns: [a, b, c]
Index: []

,如果您检查其类型

>>> df.dtypes
a      int32
b     object
c    float64
dtype: object

答案 11 :(得分:0)

在Pandas中创建空数据框以指定列类型

我认为这很完美!

import pandas as pd

c1 = pd.Series(data=None, dtype='string', name='c1')
c2 = pd.Series(data=None, dtype='bool', name='c2')
c3 = pd.Series(data=None, dtype='float', name='c3')
c4 = pd.Series(data=None, dtype='int', name='c4')

df = pd.concat([c1, c2, c3, c4], axis=1)

df.info('verbose')

我们将列创建为Series并为其赋予正确的dtype,然后将Series合并为一个DataFrame,就是这样

我们有带有dtypes的DataFrame构造函数!

<class 'pandas.core.frame.DataFrame'>
Index: 0 entries
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   c1      0 non-null      string 
 1   c2      0 non-null      bool   
 2   c3      0 non-null      float64
 3   c4      0 non-null      int32  
dtypes: bool(1), float64(1), int32(1), string(1)
memory usage: 0.0+ bytes