pythonpandasdataframespyderdata-analysis

How to place DataFrame data in one unique index?


I've got the next code:

data = [{'TpoMoneda': 'UYU'}, {'MntNetoIvaTasaMin': '3825.44'}, {'IVATasaMin': '10.000'}, {'IVATasaBasica': '22.000'}, {'MntIVATasaMin': '382.54'}, {'MntTotal': '4207.98'}, {'MntTotRetenido': '133.90'}, {'CantLinDet': '2'}, {'RetencPercep': None}, {'RetencPercep': None}, {'MontoNF': '0.12'}, {'MntPagar': '4342.00'}]

df = pd.DataFrame.from_dict(data, orient = 'columns')

My dataframe looks like this:

# TpoMoneda MntNetoIvaTasaMin IVATasaMin  ... RetencPercep MontoNF MntPagar
# 0        UYU               NaN        NaN  ...          NaN     NaN      NaN
# 1        NaN           3825.44        NaN  ...          NaN     NaN      NaN
# 2        NaN               NaN     10.000  ...          NaN     NaN      NaN
# 3        NaN               NaN        NaN  ...          NaN     NaN      NaN
# 4        NaN               NaN        NaN  ...          NaN     NaN      NaN
# 5        NaN               NaN        NaN  ...          NaN     NaN      NaN
# 6        NaN               NaN        NaN  ...          NaN     NaN      NaN
# 7        NaN               NaN        NaN  ...          NaN     NaN      NaN
# 8        NaN               NaN        NaN  ...          NaN     NaN      NaN
# 9        NaN               NaN        NaN  ...          NaN     NaN      NaN
# 10       NaN               NaN        NaN  ...          NaN    0.12      NaN
# 11       NaN               NaN        NaN  ...          NaN     NaN  4342.00
# 
# [12 rows x 11 columns]

I want to have all the data in one unique index (1 row x 11 columns), for example:

# TpoMoneda MntNetoIvaTasaMin IvaTasaMin  ... RetencPercep MontoNF MntPagar
# 0      UYU           3825.44     10.000               Nan    0.12  4342.00
# 
# [1 rows x 11 columns]

Despite I don´t speak english very well, I´m open to trying understand all the solutions someone can give me. Thank all!


Solution

  • You can use map + pd.transpose like below

    pd.DataFrame(
        map(lambda x: df[x].dropna().values, df.columns), index=df.columns
    ).transpose()
    

    which gives

      TpoMoneda MntNetoIvaTasaMin IVATasaMin IVATasaBasica MntIVATasaMin MntTotal  \
    0       UYU           3825.44     10.000        22.000        382.54  4207.98   
    
      MntTotRetenido CantLinDet RetencPercep MontoNF MntPagar  
    0         133.90          2         None    0.12  4342.00  
    

    Or, you can try pd.aggregate like below

    pd.DataFrame(
        df.agg(lambda x: x.dropna().values[0] if any(~x.isna()) else np.nan, axis=0)
    ).transpose()
    

    which gives

      TpoMoneda MntNetoIvaTasaMin IVATasaMin IVATasaBasica MntIVATasaMin MntTotal  \
    0       UYU           3825.44     10.000        22.000        382.54  4207.98   
    
      MntTotRetenido CantLinDet RetencPercep MontoNF MntPagar  
    0         133.90          2          NaN    0.12  4342.00