2014-11-28 2 views
1

Я создаю объект Pandas DataFrame с использованием конструктора DataFrame. Мои данные - это список списков и категориальных данных. Когда я передаю индекс конструктору, мой класс категориальных данных сбрасывается с помощью значений NaN. Что тут происходит? Заранее спасибо!Конструктор Pandas DataFrame вводит NaN при включении аргумента индекса

Пример:

import pandas as pd 
import numpy as np 
a = pd.Series(['a','b','c'],dtype="category") 
b = pd.Series(['a','b','c'],dtype="object") 
c = pd.Series(['a','b','cc'],dtype="object") 

A = pd.DataFrame({'A':a,'B':[1,2,3]},index=["0","1","2"]) 
AA = pd.DataFrame({'A':a,'B':[1,2,3]}) 
B = pd.DataFrame({'A':b,'C':[4,5,6]})  

print("DF A:") 
print(A) 
print("\nDF A, without specifying an index in the constructor:") 
print(AA) 
print("\nDF B:") 
print(B) 
+1

Для других, читающих эту статью, в документации четко говорится об этой проблеме: «... Таким образом, диктатор серии плюс конкретный индекс будет отбрасывать все данные, не соответствующие до индекс ssed. ... "От: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe –

ответ

2

Это не имеет ничего общего с категориями против объекта, он должен делать с выравниванием индекса.

Вы получаете NaNs в A, потому что вы говорите конструктору, что хотите индекс из трех строк. Но a имеет собственный индекс, состоящий из целых чисел [0, 1, 2]. Поскольку это не соответствует указанному вами индексу, данные не выравниваются, и поэтому вы получаете DataFrame с индексом, который, как вы сказали, хотите, и NaN выделяют, что данные отсутствуют. В отличие от этого, B - это просто список, и поэтому нет индекса для игнорирования, и, соответственно, он предполагает, что данные приведены в порядке, соответствующем индексу.

Это может быть легче увидеть, чем объяснить. Независимо от DTYPE, если индексы не совпадают, вы получаете NaN:

In [147]: pd.DataFrame({'A':pd.Series(list("abc"), dtype="category"),'B':[1,2,3]}, 
      index=["0","1","2"]) 
Out[147]: 
    A B 
0 NaN 1 
1 NaN 2 
2 NaN 3 

In [148]: pd.DataFrame({'A':pd.Series(list("abc"), dtype="object"),'B':[1,2,3]}, 
      index=["0","1","2"]) 
Out[148]: 
    A B 
0 NaN 1 
1 NaN 2 
2 NaN 3 

Если вы используете индекс полностью соответствующий, он работает:

In [149]: pd.DataFrame({'A':pd.Series(list("abc"), dtype="object"),'B':[1,2,3]}, 
      index=[0,1,2]) 
Out[149]: 
    A B 
0 a 1 
1 b 2 
2 c 3 

И если вы используете частично-согласование index, вы получите значения, где индексы выровнены и NaN там, где они этого не делают:

In [150]: pd.DataFrame({'A':pd.Series(list("abc"), dtype="object"),'B':[1,2,3]}, 
      index=[0,1,10]) 
Out[150]: 
     A B 
0  a 1 
1  b 2 
10 NaN 3 
Смежные вопросы