Onyilimba
Onyilimba

Reputation: 1217

How to keep table columns name/format with pandas pd.concat()?

I have a table like this,

  08:20:00                           PLAYERS  MEMBRESIA  JUGADORES  CARRITOS  OBSERVACION
0   900523  camilo antonio aleman campagnani        NaN        NaN       NaN          NaN
1  900-561                  josé raúl alemán        NaN        NaN       NaN          NaN
2   900553    nicolas ardito barletta maduro        NaN        NaN       NaN          NaN
3      NaN                               NaN        NaN        NaN       NaN          NaN
   08:30:00                       PLAYERS  MEMBRESIA  JUGADORES  CARRITOS  OBSERVACION
0  107546.0        erasmo raúl arias boyd        NaN        NaN       NaN          NaN
1  103283.0            diego galindo lara        NaN        NaN       NaN          NaN
2  100930.0  luis carlos jaramillo pinzón        NaN        NaN       NaN          NaN
3       NaN                           NaN        NaN        NaN       NaN          NaN
   08:40:00                               PLAYERS  MEMBRESIA  JUGADORES  CARRITOS  OBSERVACION
0  102386-1             antonio dominguez alvarez        NaN        NaN       NaN          NaN
1  102386-2  antonio enrique dominguez de obaldia        NaN        NaN       NaN          NaN
2    102386    maria del carmen de obaldia ortega        NaN        NaN       NaN          NaN
3    501248                     josé luis alvarez        NaN        NaN       NaN          NaN

After using pd.concat() to join the tables to one DataFrame, it removes the individual column heading. Result:

  08:20:00                           PLAYERS  MEMBRESIA  JUGADORES  CARRITOS  OBSERVACION
0   900523  camilo antonio aleman campagnani        NaN        NaN       NaN          NaN
1  900-561                  josé raúl alemán        NaN        NaN       NaN          NaN
2   900553    nicolas ardito barletta maduro        NaN        NaN       NaN          NaN
3      NaN                               NaN        NaN        NaN       NaN          NaN
0  107546.0        erasmo raúl arias boyd        NaN        NaN       NaN          NaN
1  103283.0            diego galindo lara        NaN        NaN       NaN          NaN
2  100930.0  luis carlos jaramillo pinzón        NaN        NaN       NaN          NaN
3       NaN                           NaN        NaN        NaN       NaN          NaN
0  102386-1             antonio dominguez alvarez        NaN        NaN       NaN          NaN
1  102386-2  antonio enrique dominguez de obaldia        NaN        NaN       NaN          NaN
2    102386    maria del carmen de obaldia ortega        NaN        NaN       NaN          NaN
3    501248                     josé luis alvarez        NaN        NaN       NaN          NaN

I want to retain the format as it is. What I am trying to do is read the HTML document, pass it to pandas read_html function, and export it as excel.

Basically, I want to retain this format. and I am relatively new to pandas.

Upvotes: 0

Views: 495

Answers (2)

Onyilimba
Onyilimba

Reputation: 1217

final = pd.concat([pd.concat([pd.DataFrame(df.columns.values).T, 
              df.rename(columns={c:i for i,c in enumerate(df.columns)})]) 
   for df in dfs])

as dfs is a list of DataFrames extracted from html tables it doesn't have the .values() method on it.

Upvotes: 0

Rob Raymond
Rob Raymond

Reputation: 31226

  • the first column of each dataframe is different. Appears as if it is a timestamp
  • copy it to a column using assign()
  • rename() it so all the data frames are consistent
data = ["""  08:20:00                           PLAYERS  MEMBRESIA  JUGADORES  CARRITOS  OBSERVACION
0   900523  camilo antonio aleman campagnani        NaN        NaN       NaN          NaN
1  900-561                  josé raúl alemán        NaN        NaN       NaN          NaN
2   900553    nicolas ardito barletta maduro        NaN        NaN       NaN          NaN
3      NaN                               NaN        NaN        NaN       NaN          NaN""",
"""   08:30:00                       PLAYERS  MEMBRESIA  JUGADORES  CARRITOS  OBSERVACION
0  107546.0        erasmo raúl arias boyd        NaN        NaN       NaN          NaN
1  103283.0            diego galindo lara        NaN        NaN       NaN          NaN
2  100930.0  luis carlos jaramillo pinzón        NaN        NaN       NaN          NaN
3       NaN                           NaN        NaN        NaN       NaN          NaN""",
"""   08:40:00                               PLAYERS  MEMBRESIA  JUGADORES  CARRITOS  OBSERVACION
0  102386-1             antonio dominguez alvarez        NaN        NaN       NaN          NaN
1  102386-2  antonio enrique dominguez de obaldia        NaN        NaN       NaN          NaN
2    102386    maria del carmen de obaldia ortega        NaN        NaN       NaN          NaN
3    501248                     josé luis alvarez        NaN        NaN       NaN          NaN"""]

dfs = {f"df{i}":pd.read_csv(io.StringIO(data),sep="\s\s+", engine="python") for i,data in enumerate(data)}

df = pd.concat([df.assign(TIMESTAMP=df.columns[0]).rename(columns={df.columns[0]:"PLAYERID"}) for df in dfs.values()])

output

PLAYERID PLAYERS MEMBRESIA JUGADORES CARRITOS OBSERVACION TIMESTAMP
0 900523 camilo antonio aleman campagnani nan nan nan nan 08:20:00
1 900-561 josé raúl alemán nan nan nan nan 08:20:00
2 900553 nicolas ardito barletta maduro nan nan nan nan 08:20:00
3 nan nan nan nan nan nan 08:20:00
0 107546.0 erasmo raúl arias boyd nan nan nan nan 08:30:00
1 103283.0 diego galindo lara nan nan nan nan 08:30:00
2 100930.0 luis carlos jaramillo pinzón nan nan nan nan 08:30:00
3 nan nan nan nan nan nan 08:30:00
0 102386-1 antonio dominguez alvarez nan nan nan nan 08:40:00
1 102386-2 antonio enrique dominguez de obaldia nan nan nan nan 08:40:00
2 102386 maria del carmen de obaldia ortega nan nan nan nan 08:40:00
3 501248 josé luis alvarez nan nan nan nan 08:40:00

supplementary

Column names are wanted as rows. concat() them back in and concat() all data frames.

# put the column back into rows and use generic column names...
pd.concat([pd.concat([pd.DataFrame(df.columns.values).T, 
                      df.rename(columns={c:i for i,c in enumerate(df.columns)})]) 
           for df in dfs.values()])


Upvotes: 1

Related Questions