在 Pandas 中保留第一个非 NaN 值之后的行

3
我在PANDAS中有一个数据帧,有两列和一个索引(日期)。我想保留第一个常见的非NaN元素之后的行。例如,最初我有:
                    A      B        
        Index
        1/1/1950    NaN    5
        2/1/1950    7      NaN
        3/1/1950    9      NaN
        4/1/1950    NaN    6
        5/1/1950    4      15
        6/1/1950    2      21
        7/1/1950    NaN    5
        7/1/1950    12     5
        7/1/1950    5      NaN 

我想要得到

                    A      B        
        Index
        5/1/1950    4      15
        6/1/1950    2      21
        7/1/1950    NaN    5
        7/1/1950    12     5
        7/1/1950    5      NaN 

自1950年5月1日以来,A和B首次不是NaN,我希望保留它之后的所有数据。感谢您的帮助。
1个回答

4

您可以在数据框上调用notnull函数,并使用all(axis=1)测试行中的所有值是否为True,然后我们可以调用argmax获取第一个True索引标签,并使用loc切片数据框:

In [37]:
df.loc[df.notnull().all(axis=1).argmax():]

Out[37]:
             A     B
Index               
5/1/1950   4.0  15.0
6/1/1950   2.0  21.0
7/1/1950   NaN   5.0
7/1/1950  12.0   5.0
7/1/1950   5.0   NaN

以下是细节解析:

In [38]:
df.notnull()

Out[38]:
              A      B
Index                 
1/1/1950  False   True
2/1/1950   True  False
3/1/1950   True  False
4/1/1950  False   True
5/1/1950   True   True
6/1/1950   True   True
7/1/1950  False   True
7/1/1950   True   True
7/1/1950   True  False

In [39]:
df.notnull().all(axis=1)

Out[39]:
Index
1/1/1950    False
2/1/1950    False
3/1/1950    False
4/1/1950    False
5/1/1950     True
6/1/1950     True
7/1/1950    False
7/1/1950     True
7/1/1950    False
dtype: bool

In [40]:
df.notnull().all(axis=1).argmax()

Out[40]:
'5/1/1950'

编辑

正如 @DSM 指出的那样,更加健壮的方法是使用 df.loc[df.notnull().all(axis=1).cummax()],因为它可以处理重复的索引值。


1
这可能会因索引而失败。像 df.loc[df.notnull().all(axis=1).cummax()] 这样的代码可能更加健壮。 - DSM
@DSM 在哪种类型的索引上会失败?你是指如果它是浮点类型还是未排序的? - EdChum
1
假设第一个非空值是1950年7月1日。当您使用'7/1/1950':进行选择时,pandas 没有办法知道您实际上想从具有该索引的第二行开始,因此输出的第一行将具有 NaN 值。 - DSM
@DSM 是的,我没有注意到这里索引中有重复项,我会进行更新。 - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接