DataFrame中行之间的二进制操作

时间:2018-01-07 06:13:08

标签: python pandas dataframe

原始数据框如下,

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)

提前致谢

1 个答案:

答案 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