Python Pandas,创建指定列数据类型的空数据帧

2024-04-19 20:03:17 发布

您现在位置:Python中文网/ 问答频道 /正文

有一件事我发现自己必须经常去做,这让我很惊讶,在熊猫身上做到这一点是多么的困难。假设我需要创建一个具有指定索引类型和名称、列类型和名称的空DataFrame。(例如,我可能想稍后在循环中填充它。)最简单的方法是为每一列创建一个空的pandas.Series对象,指定它们的dtype,将它们放入指定其名称的字典中,并将字典传递到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.

第一个问题。上面的方法真的是最简单的吗?这件事有太多令人费解的地方。我真正想做的,我很确定很多人真正想做的,是下面这样的事情。

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

第二个问题。这种语法在Pandas中有可能吗?如果不是的话,开发人员是否正在考虑支持这样的项目?我觉得它真的应该像这样简单(上面的语法)。


Tags: columns方法name名称id类型dataframepandas
3条回答

还可以通过替换数据帧列来设置其数据类型:

df['column_name'] = df['column_name'].astype(float)

你可以通过使用列表理解来简化一些事情

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

这实际上与您已经做的没有太大的不同,但是不必修改代码中的多个位置,就可以更容易地创建任意数据帧。

不幸的是,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

因此您可以看到数据类型是按需的,并且索引是按需设置的:

In [145]:

df.index
Out[145]:
Int64Index([], dtype='int64', name='id')

相关问题 更多 >