Pregunta ¿Cómo iterar sobre las filas en un DataFrame en Pandas?


Tengo un DataFrames de pandas:

import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df

Salida:

   c1   c2
0  10  100
1  11  110
2  12  120

Ahora quiero iterar sobre las filas del cuadro anterior. Para cada fila, quiero poder acceder a sus elementos (valores en celdas) por el nombre de las columnas. Entonces, por ejemplo, me gustaría tener algo así:

for row in df.rows:
   print row['c1'], row['c2']

¿Es posible hacer eso en pandas?

encontré pregunta similar. Pero no me da la respuesta que necesito. Por ejemplo, se sugiere usar:

for date, row in df.T.iteritems():

o

for row in df.iterrows():

Pero no entiendo lo que row el objeto es y cómo puedo trabajar con él.


758
2018-05-10 07:04


origen


Respuestas:


iterrows es un generador que produce tanto índice como fila

In [18]: for index, row in df.iterrows():
   ....:     print row['c1'], row['c2']
   ....:     
10 100
11 110
12 120

1092
2018-05-10 07:07



Para iterar a través de la fila de DataFrame en pandas se puede usar:

itertuples() se supone que es más rápido que iterrows()

Pero ten en cuenta, de acuerdo con los documentos (pandas 0.21.1 en este momento):

  • iterrows: dtype podría no coincidir de una fila a otra

    Como iterrows devuelve una serie para cada fila, no preserva dtypes en las filas (los dtypes se conservan en las columnas de los DataFrames).

  • iterrows: no modifique las filas

    Debieras nunca modificar algo sobre lo que estás iterando Esto no está garantizado para funcionar en todos los casos. Dependiendo de los tipos de datos, el iterador devuelve una copia y no una vista, y escribir en ella no tendrá ningún efecto.

    Utilizar DataFrame.apply () en lugar:

    new_df = df.apply(lambda x: x * 2)
    
  • itertuples:

    Los nombres de las columnas se renombrarán a nombres posicionales si son identificadores de Python no válidos, repetidos o comienzan con un guión bajo. Con una gran cantidad de columnas (> 255), se devuelven tuplas regulares.


140
2017-12-07 16:41



Mientras iterrows() es una buena opción, a veces itertuples() puede ser mucho más rápido:

df = pd.DataFrame({'a': randn(1000), 'b': randn(1000),'N': randint(100, 1000, (1000)), 'x': 'x'})

%timeit [row.a * 2 for idx, row in df.iterrows()]
# => 10 loops, best of 3: 50.3 ms per loop

%timeit [row[1] * 2 for row in df.itertuples()]
# => 1000 loops, best of 3: 541 µs per loop

115
2017-09-20 13:52



También puedes usar df.apply() para iterar sobre filas y acceder a múltiples columnas para una función.

documentos: DataFrame.apply ()

def valuation_formula(x, y):
    return x * y * 0.5

df['price'] = df.apply(lambda row: valuation_formula(row['x'], row['y']), axis=1)

61
2018-06-01 06:24



Puede usar la función df.iloc de la siguiente manera:

for i in range(0, len(df)):
    print df.iloc[i]['c1'], df.iloc[i]['c2']

42
2017-09-07 12:56



Utilizar itertuples (). Es más rápido que iterrows ():

for row in df.itertuples():
    print "c1 :",row.c1,"c2 :",row.c2

13
2017-07-27 16:32



estaba buscando Cómo iterar en filas Y columnas y terminado aquí así que:

for i, row in df.iterrows():
    for j, column in row.iteritems():
        print(column)

11
2018-01-17 09:41