简体   繁体   中英

How to create columns by looking not null values in other columns

I have the dataframe, that needs to put the not null values into the column.

For example: there maybe more than 5 columns, but no more than 2 not null values each rows

df1 = pd.DataFrame({'A' : [np.nan, np.nan, 'c',np.nan, np.nan, np.nan], 
                   'B' : [np.nan, np.nan, np.nan, 'a', np.nan,'e'],
                   'C' : [np.nan, 'b', np.nan,'f', np.nan, np.nan], 
                   'D' : [np.nan, np.nan, 'd',np.nan, np.nan, np.nan], 
                   'E' : ['a', np.nan, np.nan,np.nan, np.nan, 'a']})

   A   B   C   D   E  
NaN NaN NaN NaN   a       
NaN NaN   b NaN NaN       
  c NaN NaN   d NaN      
NaN   a   f NaN NaN      
NaN NaN NaN NaN NaN   
NaN   e NaN NaN   a      

My expected output: To generate 4 new columns, Other_1; Other_1_name; Other_2; Other_2_name, the value will go to Other_1 or Other_2 if there are not null values, and the column name will go to Other_1_name or Other_2_name. if the value is NaN leave the 4 column rows NaN.

  A   B   C   D   E  Other_1 Other_1_name Other_2 Other_2_name
NaN NaN NaN NaN   a       a          E       NaN        NaN 
NaN NaN   b NaN NaN       b          C       NaN        NaN 
  c NaN NaN   d NaN       c          A        d           D
NaN   a   f NaN NaN       a          B        f           C  
NaN NaN NaN NaN NaN     NaN         NaN      NaN        NaN  
NaN   e NaN NaN   a       e          B         a          E  

Use DataFrame.melt with missing values by DataFrame.dropna for unpivot, then add counter columns by GroupBy.cumcount and reshape by DataFrame.unstack :

df2 = df1.melt(ignore_index=False,var_name='name',value_name='val').dropna()[['val','name']]

g = df2.groupby(level=0).cumcount().add(1)
df2 = df2.set_index(g,append=True).unstack().sort_index(level=1,axis=1,sort_remaining=False)
df2.columns = df2.columns.map(lambda x: f'Other_{x[1]}_{x[0]}')
print (df2)
  Other_1_val Other_1_name Other_2_val Other_2_name
0           a            E         NaN          NaN
1           b            C         NaN          NaN
2           c            A           d            D
3           a            B           f            C
5           e            B           a            E

Last append to original:

df = df1.join(df2)
print (df)
     A    B    C    D    E Other_1_val Other_1_name Other_2_val Other_2_name
0  NaN  NaN  NaN  NaN    a           a            E         NaN          NaN
1  NaN  NaN    b  NaN  NaN           b            C         NaN          NaN
2    c  NaN  NaN    d  NaN           c            A           d            D
3  NaN    a    f  NaN  NaN           a            B           f            C
4  NaN  NaN  NaN  NaN  NaN         NaN          NaN         NaN          NaN
5  NaN    e  NaN  NaN    a           e            B           a            E

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM