Pandas / Python añadiendo fila basada en condición

Estoy buscando insertar una fila en un dataframe entre dos filas existentes en función de ciertos criterios.

Por ejemplo, mi dataframe:

import pandas as pd df = pd.DataFrame({'Col1':['A','B','D','E'],'Col2':['B', 'C', 'E', 'F'], 'Col3':['1', '1', '1', '1']}) 

Que se parece a

  Col1 Col2 Col3 0 AB 1 1 BC 1 2 DE 1 3 EF 1 

Quiero poder insertar una nueva fila entre el Índice 1 y el Índice 2 debido a la condición:

 n = 0 while n < len(df): (df.ix[n]['Col2'] == df.ix[n+1]['Col1']) == False Something, Something, insert row n+=1 

Mi tabla de salida deseada se vería así:

  Col1 Col2 Col3 0 AB 1 1 BC 1 2 CD 1 3 DE 1 4 EF 1 

Estoy luchando con la inserción condicional de filas basadas en valores en los registros anteriores y en curso. En última instancia, quiero realizar el ejercicio anterior en mi ejemplo del mundo real, que incluiría múltiples condiciones y preservar los valores de más de una columna (en este ejemplo era Col3, pero en mi mundo real serían varias columnas)

ACTUALIZACIÓN: método de ahorro de memoria: primero establezca un nuevo índice con un espacio para una nueva fila:

 In [30]: df Out[30]: Col1 Col2 Col3 0 AB 1 1 BC 1 2 DE 1 3 EF 1 

Si queremos insertar una nueva fila entre los índices 1 y 2 , dividimos el índice en la posición 2 :

 In [31]: idxs = np.split(df.index, 2) 

establecer un nuevo índice (con espacio en la posición 2 ):

 In [32]: df.set_index(idxs[0].union(idxs[1] + 1), inplace=True) In [33]: df Out[33]: Col1 Col2 Col3 0 AB 1 1 BC 1 3 DE 1 4 EF 1 

Insertar nueva fila con índice 2 :

 In [34]: df.loc[2] = ['X','X',2] In [35]: df Out[35]: Col1 Col2 Col3 0 AB 1 1 BC 1 3 DE 1 4 EF 1 2 XX 2 

índice de clasificación

 In [38]: df.sort_index(inplace=True) In [39]: df Out[39]: Col1 Col2 Col3 0 AB 1 1 BC 1 2 XX 2 3 DE 1 4 EF 1 

PD: también puede insertar DataFrame en lugar de una sola fila utilizando df.append(new_df) :

 In [42]: df Out[42]: Col1 Col2 Col3 0 AB 1 1 BC 1 2 DE 1 3 EF 1 In [43]: idxs = np.split(df.index, 2) In [45]: new_df = pd.DataFrame([['X', 'X', 10], ['Y','Y',11]], columns=df.columns) In [49]: new_df.index += idxs[1].min() In [51]: new_df Out[51]: Col1 Col2 Col3 2 XX 10 3 YY 11 In [52]: df = df.set_index(idxs[0].union(idxs[1]+len(new_df))) In [53]: df Out[53]: Col1 Col2 Col3 0 AB 1 1 BC 1 4 DE 1 5 EF 1 In [54]: df = df.append(new_df) In [55]: df Out[55]: Col1 Col2 Col3 0 AB 1 1 BC 1 4 DE 1 5 EF 1 2 XX 10 3 YY 11 In [56]: df.sort_index(inplace=True) In [57]: df Out[57]: Col1 Col2 Col3 0 AB 1 1 BC 1 2 XX 10 3 YY 11 4 DE 1 5 EF 1 

Respuesta VIEJA:

Una (entre muchas) formas de lograrlo sería dividir su DF y concatenarla con el DF necesario en el orden deseado:

DF original:

 In [12]: df Out[12]: Col1 Col2 Col3 0 AB 1 1 BC 1 2 DE 1 3 EF 1 

dividámoslo en dos partes ([0: 1], [2: fin]):

 In [13]: dfs = np.split(df, [2]) In [14]: dfs Out[14]: [ Col1 Col2 Col3 0 AB 1 1 BC 1, Col1 Col2 Col3 2 DE 1 3 EF 1] 

Ahora podemos concatenarlos juntos con un nuevo DF en el orden deseado:

 In [15]: pd.concat([dfs[0], pd.DataFrame([['C','D', 1]], columns=df.columns), dfs[1]], ignore_index=True) Out[15]: Col1 Col2 Col3 0 AB 1 1 BC 1 2 CD 1 3 DE 1 4 EF 1