python - 使用包含多种类型的 numpy 数组创建 Pandas DataFrame

标签 python numpy pandas

我想创建一个默认值为零的 pandas 数据框,但一列是整数,另一列是 float 。我能够创建具有正确类型的 numpy 数组,请参阅下面的 values 变量。但是,当我将其传递到数据框构造函数时,它仅返回 NaN 值(请参阅下面的 df)。我包含了返回 float 组的无类型代码(参见 df2)

import pandas as pd
import numpy as np

values = np.zeros((2,3), dtype='int32,float32')
index = ['x', 'y']
columns = ['a','b','c']

df = pd.DataFrame(data=values, index=index, columns=columns)
df.values.dtype

values2 = np.zeros((2,3))
df2 = pd.DataFrame(data=values2, index=index, columns=columns)
df2.values.dtype

关于如何构建数据框有什么建议吗?

最佳答案

您可以从以下几个选项中进行选择:

import numpy as np
import pandas as pd

index = ['x', 'y']
columns = ['a','b','c']

# Option 1: Set the column names in the structured array's dtype 
dtype = [('a','int32'), ('b','float32'), ('c','float32')]
values = np.zeros(2, dtype=dtype)
df = pd.DataFrame(values, index=index)

# Option 2: Alter the structured array's column names after it has been created
values = np.zeros(2, dtype='int32, float32, float32')
values.dtype.names = columns
df2 = pd.DataFrame(values, index=index, columns=columns)

# Option 3: Alter the DataFrame's column names after it has been created
values = np.zeros(2, dtype='int32, float32, float32')
df3 = pd.DataFrame(values, index=index)
df3.columns = columns

# Option 4: Use a dict of arrays, each of the right dtype:
df4 = pd.DataFrame(
    {'a': np.zeros(2, dtype='int32'),
     'b': np.zeros(2, dtype='float32'),
     'c': np.zeros(2, dtype='float32')}, index=index, columns=columns)

# Option 5: Concatenate DataFrames of the simple dtypes:
df5 = pd.concat([
    pd.DataFrame(np.zeros((2,), dtype='int32'), columns=['a']), 
    pd.DataFrame(np.zeros((2,2), dtype='float32'), columns=['b','c'])], axis=1)

# Option 6: Alter the dtypes after the DataFrame has been formed. (This is not very efficient)
values2 = np.zeros((2, 3))
df6 = pd.DataFrame(values2, index=index, columns=columns)
for col, dtype in zip(df6.columns, 'int32 float32 float32'.split()):
    df6[col] = df6[col].astype(dtype)

上面的每个选项都会产生相同的结果

   a  b  c
x  0  0  0
y  0  0  0

数据类型:

a      int32
b    float32
c    float32
dtype: object

为什么 pd.DataFrame(values, index=index, columns=columns) 生成一个带有 NaN 的 DataFrame:

values 是一个结构化数组,列名为 f0f1f2:

In [171]:  values
Out[172]: 
array([(0, 0.0, 0.0), (0, 0.0, 0.0)], 
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<f4')])

如果您将参数 columns=['a', 'b', 'c'] 传递给 pd.DataFrame,那么 Pandas 将查找具有这些参数的列结构化数组 values 中的名称。当找不到这些列时,Pandas 会将 NaN 放入 DataFrame 中以表示缺失值。

关于python - 使用包含多种类型的 numpy 数组创建 Pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21647054/

相关文章:

Python多处理池: Why doesn't adding additional processes seem to improve performance on a hyperthreaded system?

python - 如何导入文本文件以适合此聚类算法?

python - Numpy 中的一维 LDA 输出维度

python - 按 pandas 中的列名重新分类

python - Pandas 按具有混合列数据类型的日期列进行过滤

python - Pandas 聚合动态列名

javascript - 获取类型错误 : 'NoneType' object is not iterable when sending ajax post request django views

python - 如何使用 scipy.io.savemat 附加到 .mat 文件?

python - Numpy 类型错误

python - pandas 数据框样式格式不打印指定的精度