Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

174
Views
Extraiga valores en el marco de datos donde el nombre del índice es igual al nombre de la columna

Digamos que tengo el siguiente conjunto de datos:

 import numpy as np import pandas as pd d = {'column1': ['a', 'b', 'c'], 'a': [10, 8, 6], 'a1': [1, 2, 3], 'b': [4, 2, 6], 'b1': [1, 4, 8], 'c': [2, 6, 8], 'c1': [2, 1, 8] } data_frame = pd.DataFrame(data=d).set_index('column1')

Lo que quiero lograr es seguir. Sume los valores de cada fila, excluyendo las observaciones donde a=a, a=a1, b=b, b=b1, etc.

Así que en el conjunto de datos final quiero tener algo como esto:

 f={'total': [9, 17, 23]} final_frame = pd.DataFrame(data=f)

Donde 9 = b + b1 + c + c1 y así sucesivamente.

Obviamente, puedo lograr esto con el comando iloc[] en cada fila. Pero mi marco de datos real es bastante grande y, como puede ver, la posición de los elementos ij que deben eliminarse no es constante en las filas (por lo que cada iloc en cada fila será una secuencia diferente, pero consistente).

¿Alguna sugerencia?

Mejor,

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Solución con DataFrame.melt , comapre índices por nombres de columnas sin números y para sum agregadas no iguales:

 df = data_frame.melt(ignore_index=False) df = (df.loc[df['variable'].str.extract('(\D+)', expand=False).ne(df.index), 'value'] .groupby(level=0) .sum() .reset_index(name='total')) print (df) column1 total 0 a 9 1 b 17 2 c 23

Otra idea:

 df = data_frame.copy() df.columns = df.columns.str.extract('(\D+)', expand=False) s = df.groupby(level=0, axis=1).sum().stack() df = s[[a != b for a, b in s.index]].groupby(level=0).sum().reset_index(name='total') print (df) column1 total 0 a 9 1 b 17 2 c 23
over 4 years ago · Santiago Trujillo Report

0

Una opción más rápida, en mi opinión, sería evitar aumentar el número de filas (las pruebas son la única forma de confirmar esto):

 data_frame.columns =data_frame.columns.str.split(r'(\d+)', expand = True).droplevel(-1) temp = data_frame.set_index([np.arange(len(data_frame))], append=True).unstack(level=0) filters = [col for col in temp if col[0] != col[-1]] out = temp.loc[:, filters].sum(1) out.to_frame(name='total') total 0 9.0 1 17.0 2 23.0
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!