python string pandas dataframe nan

python - Izquierda justificar valores de cadena en un marco de datos de pandas



string dataframe (1)

Primero, extraiga una porción de columnas que comience con el item :

m = df.columns.str.contains(''item'') i = df.iloc[:, m]

Enmascare todos los valores que cumplan con sus criterios. Use isin -

j = i[~i.isin(df.makrc.tolist() + [''not''])]

Ahora. ordenar valores basados ​​en NaNs y asignar de nuevo -

df.loc[:, m] = j.apply(sorted, key=pd.isnull, axis=1) df key sellyr brand makrc item1 item2 item3 item4 item5 item6 0 da12 2013 imp apt furi NaN NaN NaN NaN NaN 1 da32 2013 sa rye app NaN NaN NaN NaN NaN 2 da14 2013 sa pro pan fan NaN NaN NaN NaN

Detalles

i item1 item2 item3 item4 item5 item6 0 furi apt NaN NaN NaN NaN 1 rye app NaN NaN NaN NaN 2 not pro pan fan NaN NaN

j item1 item2 item3 item4 item5 item6 0 furi NaN NaN NaN NaN NaN 1 NaN app NaN NaN NaN NaN 2 NaN NaN pan fan NaN NaN

Hacia un mejor rendimiento

Podría utilizar una versión modificada de la función justified de Divakar que funciona en matrices de objetos:

def justify(a, invalid_val=0, axis=1, side=''left''): """ Justifies a 2D array Parameters ---------- A : ndarray Input array to be justified axis : int Axis along which justification is to be made side : str Direction of justification. It could be ''left'', ''right'', ''up'', ''down'' It should be ''left'' or ''right'' for axis=1 and ''up'' or ''down'' for axis=0. """ if invalid_val is np.nan: mask = pd.notnull(a) else: mask = a!=invalid_val justified_mask = np.sort(mask,axis=axis) if (side==''up'') | (side==''left''): justified_mask = np.flip(justified_mask,axis=axis) out = np.full(a.shape, invalid_val, dtype=object) if axis==1: out[justified_mask] = a[mask] else: out.T[justified_mask.T] = a.T[mask.T] return out

df.loc[:, m] = justify(j.values, invalid_val=np.nan, axis=1, side=''left'') df key sellyr brand makrc item1 item2 item3 item4 item5 item6 0 da12 2013 imp apt furi NaN NaN NaN NaN NaN 1 da32 2013 sa rye app NaN NaN NaN NaN NaN 2 da14 2013 sa pro pan fan NaN NaN NaN NaN

Esto (con suerte) debería ser más rápido que apply . Verá especialmente ganancias de velocidad utilizando la versión original de la función que está optimizada para datos numéricos.

Entonces, tengo un DataFrame con 180000+ valores y necesito (1) reemplazar duplicados y ciertos valores en celdas por fila y (2) reorganizar. Aquí está mi DataFrame, df:

key sellyr brand makrc item1 item2 item3 item4 item5 item6 0 da12 2013 imp apt furi apt nan nan nan nan 1 da32 2013 sa rye rye app nan nan nan nan 2 da14 2013 sa pro not pro pan fan nan nan ........

los valores nan representan np.nan. Y la cadena prohibida es ''no''.

Entonces, lo que necesito hacer es verificar las columnas item1 ~ 6 reemplazar cadenas que están contenidas en la columna makrc con nan. Además, también quiero reemplazar ''not''s'' con nan''s. Después de reemplazar las cadenas a np.nan, necesito reorganizar el elemento 1 ~ 6 a la izquierda para justificar los datos que no son nan a la celda vacía más a la izquierda, como se muestra a continuación, (salida esperada):

key sellyr brand makrc item1 item2 item3 item4 item5 item6 0 da12 2013 imp apt furi nan nan nan nan nan 1 da32 2013 sa rye app nan nan nan nan nan 2 da14 2013 sa pro pan fan nan nan nan nan ........

Entonces, como puede ver en un primer índice, eliminé la cadena apt en item2 y la cambié a np.nan porque la misma cadena está en la columna makrc. En el índice 1, eliminé centeno y lo reemplacé por np.nan. Pero esta vez, reorganicé la cadena ''app'' de item2 a item1 porque los valores de np.nan deberían ir después de los valores. En el índice 2, he reemplazado pro y no desde que necesito reemplazar cada ''not''string en las columnas del elemento para np.nan. También he reorganizado los artículos.

Intenté combinar todas las columnas de elementos como una lista y reemplazarla, pero hay algunas filas con solo elementos np.nan. ¿Pueden recomendarme un proceso ideal para resolver mi problema? Muchas gracias.