una promedio filas datos crear columnas columna agregar python pandas

promedio - crear columnas en python



Insertar una fila en el marco de datos de los pandas (5)

Tengo un marco de datos ...

s1 = pd.Series([5, 6, 7]) s2 = pd.Series([7, 8, 9]) df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"]) A B C 0 5 6 7 1 7 8 9 [2 rows x 3 columns]

y necesito agregar una primera fila [2, 3, 4] para obtener ...

A B C 0 2 3 4 1 5 6 7 2 7 8 9

He probado las funciones de agregar () y concat (), pero de alguna manera no puedo encontrar la manera correcta de hacerlo.

¿Algunas ideas? ¿Hay alguna manera directa de agregar / insertar series en el marco de datos?


Configuré una función corta que permite un poco más de flexibilidad al insertar una fila:

def insert_row(idx, df, df_insert): dfA = df.iloc[:idx, ] dfB = df.iloc[idx:, ] df = dfA.append(df_insert).append(dfB).reset_index(drop = True) return df

que podría acortarse aún más a:

def insert_row(idx, df, df_insert): return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

Entonces podrías usar algo como:

df = insert_row(2, df, df_new)

donde 2 es la posición del índice en df donde desea insertar df_new .


No estoy seguro de cómo se llamaba concat () pero debería funcionar siempre que ambos objetos sean del mismo tipo. ¿Tal vez el problema es que necesitas lanzar tu segundo vector a un marco de datos? Usando el df que definió los siguientes trabajos para mí.

>>>df2 = pd.DataFrame([[2,3,4]],columns=[''A'',''B'',''C'']) >>>pd.concat([df2,df])


Podemos usar numpy.insert . Esto tiene la ventaja de la flexibilidad. Solo necesita especificar el índice al que desea insertar.

s1 = pd.Series([5, 6, 7]) s2 = pd.Series([7, 8, 9]) df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"]) pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0)) 0 1 2 0 2 3 4 1 5 6 7 2 7 8 9

Para np.insert(df.values, 0, values=[2, 3, 4], axis=0) , 0 le dice a la función el lugar / índice que desea colocar los nuevos valores.


Simplemente asigne una fila a un índice en particular, usando loc :

df.loc[-1] = [2, 3, 4] # adding a row df.index = df.index + 1 # shifting index df = df.sort_index() # sorting by index

Y obtienes, como deseas:

A B C 0 2 3 4 1 5 6 7 2 7 8 9

Ver en la documentación de Pandas Indexación: Configuración con ampliación .


Una forma de lograr esto es

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=[''A'', ''B'', ''C'']).append(df, ignore_index=True) Out[330]: A B C 0 2 3 4 1 5 6 7 2 7 8 9

En general, es más fácil agregar marcos de datos, no series. En su caso, dado que desea que la nueva fila esté "en la parte superior" (con el ID de inicio), y no hay ninguna función pd.prepend() , primero creo el nuevo marco de datos y luego anexo el anterior.

ignore_index ignorará el viejo índice en curso en su marco de datos y se asegurará de que la primera fila realmente comience con el índice 1 lugar de reiniciar con el índice 0 .

Descargo de responsabilidad típico: Cetero censeo ... filas anexas es una operación bastante ineficiente. Si le importa el rendimiento y de alguna manera puede asegurarse de crear primero un marco de datos con el índice correcto (más largo) y luego simplemente insertando la fila adicional en el marco de datos, definitivamente debe hacerlo. Ver:

>>> index = np.array([0, 1, 2]) >>> df2 = pd.DataFrame(columns=[''A'', ''B'', ''C''], index=index) >>> df2.loc[0:1] = [list(s1), list(s2)] >>> df2 Out[336]: A B C 0 5 6 7 1 7 8 9 2 NaN NaN NaN >>> df2 = pd.DataFrame(columns=[''A'', ''B'', ''C''], index=index) >>> df2.loc[1:] = [list(s1), list(s2)]

Hasta ahora, tenemos lo que tenías como df :

>>> df2 Out[339]: A B C 0 NaN NaN NaN 1 5 6 7 2 7 8 9

Pero ahora puede insertar fácilmente la fila de la siguiente manera. Dado que el espacio fue preasignado, esto es más eficiente.

>>> df2.loc[0] = np.array([2, 3, 4]) >>> df2 Out[341]: A B C 0 2 3 4 1 5 6 7 2 7 8 9