Tengo un dataframe se parece a esto:
PQL 1 2 3 2 3 4 5 6,7
El objective es comprobar si hay algún valor en L
, si hay que extraer el valor en la columna L
y P
PL 1 3 4,6 4,7
Tenga en cuenta que podría haber más de un valor en L
, en el caso de más de 1 valor, necesitaría filas.
A continuación se encuentra mi script actual, no puede generar el resultado esperado.
df2 = [] ego other newrow = [] for item in data_DF.iterrows(): if item[1]["L"] is not None: ego = item[1]['P'] other = item[1]['L'] newrow = ego + other + "\n" df2.append(newrow) data_DF2 = pd.DataFrame(df2)
Primero, extraigo varios valores de la columna L
a los nuevos marcos de datos con un índice de duplicidad del índice original. Eliminar las columnas innecesarias L
y Q
Luego, agregue la salida a las filas df
y drop originales con valores de NaN
.
print df PQL 0 1 2 3 1 2 3 NaN 2 4 5 6,7 s = df['L'].str.split(',').apply(pd.Series, 1).stack() s.index = s.index.droplevel(-1) # to line up with df's index s.name = 'L' print s 0 3 2 6 2 7 Name: L, dtype: object df = df.drop( ['L', 'Q'], axis=1) df = df.join(s) print df PL 0 1 3 1 2 NaN 2 4 6 2 4 7 df = df.dropna().reset_index(drop=True) print df PL 0 1 3 1 4 6 2 4 7
Primero, puede extraer todas las filas de las columnas L
y P
donde L
no falta, así:
df2 = df[~pd.isnull(df.L)].loc[:, ['P', 'L']].set_index('P')
A continuación, puede tratar los múltiples valores en algunas de las L
filas restantes de la siguiente manera:
df2 = df2.L.str.split(',', expand=True).stack() df2 = df2.reset_index().drop('level_1', axis=1).rename(columns={0: 'L'}).dropna() df2.L = df2.L.str.strip()
Para explicar: con P
como index
, el código divide el contenido de string
de la columna L
en ','
y distribuye los elementos individuales en varias columnas. A continuación, astack las diversas columnas nuevas en una sola columna nueva y limpia el resultado.