Lo que quiero hacer debería ser muy simple. Esencialmente, tengo un marco de datos, necesito asignar algún valor de tupla a alguna columna.

Por ejemplo:

pd_tmp = pd.DataFrame(np.random.rand(3,3))
pd_tmp["new_column"] = ("a",2)

Solo necesito una nueva columna con valor de tupla, ¿qué debo hacer?

ValueError: Length of values does not match length of index

El código anterior obtiene el error.

7
user40780 28 oct. 2017 a las 05:16

4 respuestas

La mejor respuesta

Puedes envolver las tuplas en una lista:

import pandas as pd
pd_tmp = pd.DataFrame(np.random.rand(3,3))
pd_tmp["new_column"] = [("a",2)] * len(pd_tmp)

pd_tmp
#          0           1           2    new_column
#0  0.835350    0.338516    0.914184    (a, 2)
#1  0.007327    0.418952    0.741958    (a, 2)
#2  0.758607    0.464525    0.400847    (a, 2)
11
Psidom 28 oct. 2017 a las 02:18

El documento de series.

Series es una matriz etiquetada unidimensional capaz de contener cualquier tipo de datos (enteros, cadenas, números de coma flotante, objetos de Python, etc.). Las etiquetas de los ejes se denominan colectivamente índice. El método básico para crear una serie es llamar a:

>>> s = pd.Series(data, index=index)

Aquí, los datos pueden ser muchas cosas diferentes:

  • un dict Python
  • un ndarray
  • un valor escalar (como 5)

Entonces Series no tomará el tipo de tupla directamente.
La respuesta de @ Psidom es hacer que la tupla sea el elemento de un ndarray.

Si está preguntando cómo establece una celda de Serie / Marco de datos, esa es una pregunta que se hace.

1
Shihe Zhang 28 oct. 2017 a las 02:31

Puede usar apply con un lambda que devuelve el tuple

pd_tmp.assign(newc_olumn=pd_tmp.apply(lambda x: ('a', 2), 1))

          0         1         2 newc_olumn
0  0.373564  0.806956  0.106911     (a, 2)
1  0.332508  0.711735  0.230347     (a, 2)
2  0.516232  0.343266  0.813759     (a, 2)
2
piRSquared 28 oct. 2017 a las 03:25

Estaba buscando algo similar, pero en mi caso quería que la tupla fuera una combinación de las columnas existentes, no solo un valor fijo. Encontré la solución a continuación, que comparto con la esperanza de que sea útil para otros, como yo.

In [24]: df
Out[24]:
      A     B
0     1     2
1    11    22
2   111   222
3  1111  2222

In [25]: df['D'] = df[['A','B']].apply(tuple, axis=1)

In [26]: df
Out[26]:
      A     B             D
0     1     2        (1, 2)
1    11    22      (11, 22)
2   111   222    (111, 222)
3  1111  2222  (1111, 2222)
0
Stefano Paoli 21 may. 2019 a las 21:53