【问题标题】:Creating a Pandas DataFrame with a numpy array containing multiple types使用包含多种类型的 numpy 数组创建 Pandas DataFrame
【发布时间】:2014-03-06 00:06:23
【问题描述】:

我想创建一个默认值为 0 的 pandas 数据框,但其中一列是整数,另一列是浮点数。我能够创建一个具有正确类型的 numpy 数组,请参见下面的 values 变量。但是,当我将它传递给数据框构造函数时,它只返回 NaN 值(参见下面的df)。我已经包含了返回浮点数组的无类型代码(请参阅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

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

【问题讨论】:

    标签: python numpy pandas


    【解决方案1】:

    您可以选择以下几个选项:

    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 会将 NaNs 放在 DataFrame 中以表示缺失值。

    【讨论】:

    • 很高兴知道为什么会这样,所以我们不只是复制和粘贴解决方案。谢谢!
    • @rocarvaj:你觉得需要解释什么?
    • 何时使用标准 DataFrame 构造函数以及何时使用 from_records。
    • @rocarvaj:我认为使用pd.DataFrame.from_records 的原始解决方案不是一个好的选择,因为它不会生成具有所需列名的DataFrame。所以我重写了我的答案以显示其他选择。
    • @rocarvaj:我不知道使用pd.DataFrame.from_records 比使用pd.DataFrame 本身更方便的情况。
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2020-08-04
    • 1970-01-01
    • 2019-03-12
    • 2015-12-16
    相关资源
    最近更新 更多