原始数据框如下,
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
所需的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
我的解决方案:
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
然后,除了该列中的2行都是非NaN之外,我怎样才能给出NaN的每个列值?我在这个小问题上浪费了2个小时试图用pythonic的方式来做它,除了if / else / for循环。 最后一步将是,
s.fillna(method='ffill',axis=1,inplace=True)
提前致谢
答案 0 :(得分:1)
您可以为any
NaN
个值的列创建掩码,然后按NaN
设置loc
:
s2 = s1.shift(periods=1,axis=1)
#added ignore_index=True for default unique index
s = pd.concat([s2,s1], axis='index', ignore_index=True)
m = s.isnull().any()
#alternative
#m = ~s.notnull().all()
s.loc[:, m] = np.nan
print(s)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 NaN 1 NaN NaN NaN NaN 2 NaN NaN NaN NaN 3 NaN NaN NaN
1 NaN a NaN NaN NaN NaN b NaN NaN NaN NaN c NaN NaN NaN
详情:
print(s.isnull())
0 1 2 3 4 5 6 7 8 9 10 11 \
0 True False True True True True False True True True True False
1 True False True True True True False True True True True False
12 13 14
0 True True True
1 True True True
print(m)
0 True
1 False
2 True
3 True
4 True
5 True
6 False
7 True
8 True
9 True
10 True
11 False
12 True
13 True
14 True
dtype: bool