Python Pandas,创建指定列dtypes的空DataFrame

Ray*_*Ray 12 python dataframe pandas

有一件事我发现自己必须经常这样做,令我惊讶的是,在熊猫中实现这一目标是多么困难.假设我需要DataFrame使用指定的索引类型和名称以及列类型和名称创建一个空.(我可能想稍后在循环中填充它.例如.)我发现,最简单的方法是pandas.Series为每个列创建一个空对象,指定它们的dtypes,将它们放入一个字典中,指定它们名称,并将字典传递给DataFrame构造函数.像下面这样的东西.

def create_empty_dataframe():
    index = pandas.Index([], name="id", dtype=int)
    column_names = ["name", "score", "height", "weight"]
    series = [pandas.Series(dtype=str), pandas.Series(dtype=int), pandas.Series(dtype=float), pandas.Series(dtype=float)]
    columns = dict(zip(column_names, series))
    return pandas.DataFrame(columns, index=index, columns=column_names)
    # The columns=column_names is required because the dictionary will in general put the columns in arbitrary order.
Run Code Online (Sandbox Code Playgroud)

第一个问题.上面真的是最简单的方法吗?关于这一点有很多令人费解的事情.我真正想做的事情,以及我很确定很多人真正想要做的事情,就像下面这样.

df = pandas.DataFrame(columns=["id", "name", "score", "height", "weight"], dtypes=[int, str, int, float, float], index_column="id") 
Run Code Online (Sandbox Code Playgroud)

第二个问题.在熊猫中这种语法是否可行?如果不是,开发人员是否考虑支持这样的事情?我觉得它真的应该像这样简单(上面的语法).

Ell*_*iot 9

您可以使用字典来简化事情:

def create_empty_dataframe():
    index = pandas.Index([], name="id", dtype=int)
    # specify column name and data type 
    columns = [('name', str),
               ('score', int),
               ('height', float),
               ('weight', float)]
    # create the dataframe from a dict
    return pandas.DataFrame({k: pandas.Series(dtype=t) for k, t in columns})
Run Code Online (Sandbox Code Playgroud)

这样,应该更容易创建任意数据帧,而无需修改代码中的多个位置。


EdC*_*ica 7

不幸的是,DateFramector 接受单个dtype描述符,但是您可以使用read_csv以下方法作弊:

In [143]:
import pandas as pd
import io
cols=["id", "name", "score", "height", "weight"]
df = pd.read_csv(io.StringIO(""), names=cols, dtype=dict(zip(cols,[int, str, int, float, float])), index_col=['id']) 
df.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 0 entries
Data columns (total 4 columns):
name      0 non-null object
score     0 non-null int32
height    0 non-null float64
weight    0 non-null float64
dtypes: float64(2), int32(1), object(1)
memory usage: 0.0+ bytes
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到 dtypes 是所需的,并且索引是根据需要设置的:

In [145]:

df.index
Out[145]:
Int64Index([], dtype='int64', name='id')
Run Code Online (Sandbox Code Playgroud)