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.
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
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