Python 数据帧中行之间的二进制操作
原始数据帧如下所示Python 数据帧中行之间的二进制操作,python,pandas,dataframe,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 所需数据帧 Nan 1 NaN NaN NaN Nan 2 NaN NaN NaN
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
所需数据帧
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个小时,试图找到一种类似Python的方法来实现它,除了if/else/for循环。
最后一步是,
s.fillna(方法='ffill',轴=1,在位=True)
提前感谢您可以使用
NaN
s值为列创建掩码,然后通过loc
设置NaN
s:
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
所以基本上,数据
[1,'a',NaN,NaN,NaN,NaN]
意味着NaN
同时适用于1
和a
?这就是为什么您希望相同的数据显示两次,一次显示第一行的1,一次显示第二行的a
?对不起,我不明白您的意思。但“NaN”的数量与1或“a”之间没有联系。我只想把数字(1,或2,或3)向上移动一层,分别放在“a”,“b”和“c”的上面。好的,明白了。为什么期望的输出有一个NaN作为第一列,在1和2之后加上一个附加的NaN,而不是在3之后?这是故意的吗?s.loc[:,m]=np.nan
做什么?它通过布尔掩码设置NaNs。是的,我知道了,但是,m
的东西,在什么地方有记录吗?它意味着按列应用掩码,而不是按行默认设置。我正在文档中查找,但找不到。@hansaplast不确定这是否是您要查找的内容。