Estoy tratando de recorrer una lista de tuplas agregando un valor al final de cada una que corresponde a un valor en una columna en un marco de datos de pandas.

df1 = [(1,2),(4,5),(8,9)]

df2 = pd.DataFrame({'Alpha': [2, 4, 8],
                    'Beta': ["a","b","c"]})

df3 = []

for i in df1:
    print(i)

for i,j in df2["Beta"], df1:
    j = j + (i,)
    df3.append(j)

print(df3)

Esperaría que print (df3) muestre lo siguiente:

[(1, 2, 'a'), (4, 5, 'b'), (8, 9, 'c')]

Sin embargo, recibo un error que indica demasiados valores para descomprimir.

0
AlmostThere 20 feb. 2020 a las 16:56

2 respuestas

La mejor respuesta

Utilice zip, enumere la solución de comprensión:

df3 = [j + (i,) for i,j in zip(df2["Beta"], df1)]

La solución debe cambiarse:

for i,j in zip(df2["Beta"], df1):
    j = j + (i,)
    df3.append(j)

print(df3)
[(1, 2, 'a'), (4, 5, 'b'), (8, 9, 'c')] 
1
jezrael 20 feb. 2020 a las 13:58

Una forma de utilizar una lista de comprensión sería:

[(*i, j) for i, j in zip(df1,  df2.Beta)]
# [(1, 2, 'a'), (4, 5, 'b'), (8, 9, 'c')]

O también podría map con operator.add:

from operator import add
list(map(add, df1, df2.Beta.map(tuple)))
# [(1, 2, 'a'), (4, 5, 'b'), (8, 9, 'c')]

O trabajando desde pandas:

(pd.Series(df1) + df2.Beta.map(tuple)).values.tolist()
# [(1, 2, 'a'), (4, 5, 'b'), (8, 9, 'c')]
1
yatu 20 feb. 2020 a las 14:02