2014-02-08 3 views
13

Я хочу создать фрейм данных pandas со значениями по умолчанию, равными нулю, но один столбец целых чисел и другой поплавков. Я могу создать массив numpy с правильными типами, см. Переменную values ниже. Однако, когда я передаю это в конструктор dataframe, он возвращает значения NaN (см. Ниже df). У меня есть включают нетипизированный код, который возвращает массив поплавки (см df2)Создание Pandas DataFrame с массивом numpy, содержащим несколько типов.

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 

Любые предложения о том, как построить dataframe?

ответ

33

Вот несколько вариантов, вы можете выбрать из:

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 

с dtypes:

a  int32 
b float32 
c float32 
dtype: object 

Почему pd.DataFrame(values, index=index, columns=columns) производит DataFrame с NaNs:

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, то панды будет искать для столбцов с теми, имена в структурированном массиве values. Когда эти столбцы не найдены, Pandas помещает NaN s в DataFrame для представления отсутствующих значений.

+0

Было бы неплохо узнать, почему это работает, поэтому мы не просто копируем и вставляем решение. Благодаря! – rocarvaj

+0

@rocarvaj: Что вы чувствуете, нуждаетесь в выдохе? – unutbu

+0

Когда использовать стандартный конструктор DataFrame и когда использовать from_records. – rocarvaj

Смежные вопросы