Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧中行之间的二进制操作_Python_Pandas_Dataframe - Fatal编程技术网

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不确定这是否是您要查找的内容。