Pandas: Al agregar una serie a un DataFrame con un índice diferente, la serie se convierte en todos los NaN

Creado en 6 dic. 2011  ·  9Comentarios  ·  Fuente: pandas-dev/pandas

Caso en punto:

>>> df
               RP/Rsum  P.value
ID                             
A_23_P42353    17.8     0      
A_23_P369994   15.91    0      
A_33_P3262440  436.7    0.0005 
A_32_P199429   18.97    0      
A_23_P256724   22.24    0      
A_33_P3394689  24.24    0      
A_33_P3403117  27.14    0      
A_24_P252364   28.56    0      
A_23_P99515    31.82    0      
A_24_P261750   31.46    0 

>>> df.dtypes
RP/Rsum    float64
P.value    float64

>>> ids = pandas.Series(['51513', '9201', np.nan, np.nan, '8794', '6530', '7025', '4897', '84935', '11081'])
>>> df["test"] = ids
>>> df
               RP/Rsum  P.value  test
ID                                   
A_23_P42353    17.8     0        NaN 
A_23_P369994   15.91    0        NaN 
A_33_P3262440  436.7    0.0005   NaN 
A_32_P199429   18.97    0        NaN 
A_23_P256724   22.24    0        NaN 
A_33_P3394689  24.24    0        NaN 
A_33_P3403117  27.14    0        NaN 
A_24_P252364   28.56    0        NaN 
A_23_P99515    31.82    0        NaN 
A_24_P261750   31.46    0        NaN 
>>> df.dtypes
RP/Rsum    float64
P.value    float64
test       object

Esto también sucede con objetos flotantes y similares. No estoy seguro de cuál es el detonante.

Comentario más útil

La serie recibe un índice 0, ..., N-1 implícito cuando no proporciona uno, por lo que este es exactamente el comportamiento que esperaría. Si data fuera un ndarray sin formato o una lista, esto no ocurriría. Entonces, el hecho de que cuando lo hagas:

df[col] = series

y se ajusta a la serie exactamente con el índice de df , eso es una característica y no un error :)

df['test'] = ids.values

funcionaría bien en tu ejemplo

Todos 9 comentarios

Me pregunto si está relacionado con este problema que encontré también esta mañana:

>>> df = pandas.DataFrame(index=[1,2,3,4])
>>> df["test"] = pandas.Series(["B", "fdf", "344", np.nan])
>>> df["test2"] = ["B", "fdf", "344", np.nan]
>>> df   test  test2
1  fdf   B    
2  344   fdf  
3  NaN   344  
4  NaN   nan  

Me parece una especie de error de uno en uno.

Investigar más lleva a la llamada a Series.reindex cuando se configuran elementos como culpables:

>>> data 
0    B
1    fdf
2    344
3    NaN

>>>  df.index = ["A", "B", "C", "D"]
>>> data.reindex(df.index).values
array([nan, nan, nan, nan], dtype=object)

Aún más indagación conduce a reindex en el atributo de índice que se llama que da un resultado extraño:

>>> data.index.reindex(df.index)
(Index([A, B, C, D], dtype=object), array([-1, -1, -1, -1], dtype=int32))

Estos -1 se traducen luego a NaN.

Título de error actualizado con una descripción más correcta.

La serie recibe un índice 0, ..., N-1 implícito cuando no proporciona uno, por lo que este es exactamente el comportamiento que esperaría. Si data fuera un ndarray sin formato o una lista, esto no ocurriría. Entonces, el hecho de que cuando lo hagas:

df[col] = series

y se ajusta a la serie exactamente con el índice de df , eso es una característica y no un error :)

df['test'] = ids.values

funcionaría bien en tu ejemplo

En ese caso, tal vez debería documentarse en algún lugar si aún no lo está. Mientras tanto, ajustaré mi propio código como sugirió, gracias.

http://pandas.sourceforge.net/dsintro.html#column -selection-added-deletion

When inserting a Series that does not have the same index as the DataFrame, it will be conformed to the DataFrame’s index:

In [180]: df['one_trunc'] = df['one'][:2]

In [181]: df
Out[181]: 
   one  flag   foo  one_trunc
a  1    False  bar  1        
b  2    False  bar  2        
c  3    True   bar  NaN      
d  NaN  False  bar  NaN      

You can insert raw ndarrays but their length must match the length of the DataFrame’s index.

¿Cuál es la idea detrás del hecho de que al insertar una serie que no tiene el mismo índice que el DataFrame, se ajustará al índice del DataFrame?

Al crear un DataFrame a partir de series, el índice resultante cubre todos los índices de series individuales. Entonces, ¿por qué no se usa esta idea cuando df ['new_column'] = series?
Entonces, ¿intenta agregar datos, pero ignora todos los valores que no coinciden con el índice DataFrame?
Si existiera _extensión del índice_, siempre se podría hacer df ['new_column'] = series.reindex (df.index) cuando uno no quiere extender el índice (comportamiento actual)?

In [256]: df = pandas.DataFrame({'A': pandas.Series(['foo', 'bar'], index=['a', 'b']),
   .....:                        'B': pandas.Series([10, 20], index=['b', 'c'])})

In [257]: df
Out[257]:
   A    B
a  foo  NaN
b  bar  10.000
c  NaN  20.000

In [258]: df['C'] = pandas.Series(range(3), index=['a', 'c', 'd'])

In [259]: df
Out[259]:
   A    B       C
a  foo  NaN     0.000
b  bar  10.000  NaN
c  NaN  20.000  1.000

En el ejemplo anterior, esperaría una fila 'd' en el DataFrame.

Bueno, creo que la idea básica es que DataFrame es un "contenedor de Series de tipo dictado de longitud fija". Cuando construye un DataFrame con un dict de Series sin un índice explícito, no hay un índice obvio que no sea la unión de todos ellos.

Puedo ver el argumento para extender implícitamente el índice, pero hay compensaciones de cualquier manera

¿Fue útil esta página
0 / 5 - 0 calificaciones