Original Dataframe as below,
s1 = pd.DataFrame([1,'a',np.nan,np.nan,np.nan,2,'b',np.nan,np.nan,np.nan,3,'c',np.nan,np.nan,np.nan]).T
In [37]: s1
Out[37]:
1 a NaN NaN NaN 2 b NaN NaN NaN 3 c NaN NaN NaN
Desired DataFrame
Nan 1 NaN NaN NaN Nan 2 NaN NaN NaN Nan 3 NaN NaN NaN
Nan a NaN NaN NaN Nan b NaN NaN NaN Nan c NaN NaN NaN
My solution:
s2 =s1.shift(periods=1,axis=1)
s=pd.concat([s2,s1],axis='index',join='inner',ignore_index=True,copy=False)
print(s)
Nan 1 a NaN NaN NaN 2 b NaN NaN NaN 3 c NaN NaN NaN
1 a NaN NaN NaN 2 b NaN NaN NaN 3 c NaN NaN NaN
Then, how can I give each column value of NaN except that 2 rows in that column are all non-NaN? I wasted 2 hours on this small issue trying to come up a pythonic way to do it except if/else/for loop. last step will be,
s.fillna(method='ffill',axis=1,inplace=True)
Thanks in advance
[1, 'a', NaN, NaN, NaN, Nan]means that theNaNgoes for both1anda? That's why you want this same data displayed twice, one time with the 1 in the first row and one time with theain the 2nd row?