我想创建一个默认值为零的 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
是一个结构化数组,列名为 f0
、f1
、f2
:
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/