Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Merging Top Two Rows of a dataframe and editing the result

I have a dataframe:

df = pd.DataFrame({ 
'0': ['FY18', 'Q1', 1500, 1200, 950, 2200], 
'1': ['FY18', 'Q2', 2340, 1234, 2000, 1230],
'2': ['FY18', 'Q3', 2130, 2200, 2190, 2210],   
'3': ['FY18','YearTotal', 1000, 1900, 1500, 1800], 
})

I wish to merge the top two rows of the dataframe and make it the index

I tried:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Merge the top two rows into a single row

merged_row = pd.concat([df.iloc[0], df.iloc[1]], axis=1)

Transpose the merged row to make it a single row with all columns

merged_row = merged_row.T

Replace the first row of the DataFrame with the merged row

df.iloc[0] = merged_row

But I get an error

ValueError: Incompatible indexer with DataFrame

Further I want to edit the header so it reverse the ‘Q1’ to ‘1Q’. Also deletes ‘ YearTotal’ and keeps just ‘FY18’ when the column says ‘YearTotal’.
The final output could look like this:

df = pd.DataFrame({ 
'0': ['1Q18', 1500, 1200, 950, 2200], 
'1': ['2Q18', 2340, 1234, 2000, 1230],
'2': ['3Q18', 2130, 2200, 2190, 2210],   
'3': ['FY18', 1000, 1900, 1500, 1800], 
})

>Solution :

No need for transposing the dataframe, in my opinion. You can just replace the 0 row with the needed values and drop the 1st row:

def get_unified_value(vals):
    if vals[1].startswith("Q"):
        return vals[1][1:] + "Q" + vals[0][2:]
    
    return vals[0]

df.loc[0, :] = list(map(get_unified_value, zip(df.loc[0, :], df.loc[1, :])))
print(
    df.drop(1).reset_index(drop=True)
)

Output:

      0     1     2     3
0  1Q18  2Q18  3Q18  FY18
1  1500  2340  2130  1000
2  1200  1234  2200  1900
3   950  2000  2190  1500
4  2200  1230  2210  1800
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading