【问题标题】:How to get row, column indices of all non-NaN items in Pandas dataframe如何获取 Pandas 数据框中所有非 NaN 项的行、列索引
【发布时间】:2016-07-22 10:01:37
【问题描述】:

如何遍历如下所示的数据帧并将非 NaN 值位置作为元组返回。即

df:

     0    1    2
0    NaN NaN   1
1    1   NaN  NaN
2    NaN  2   NaN

我会得到 [(0, 1), (2, 0), (1, 2)] 的输出。最好的方法是做一个嵌套的for循环吗?或者有没有更简单的方法我不知道通过 Pandas。

【问题讨论】:

标签: python pandas nan indices


【解决方案1】:

假设您不需要按顺序排列,您可以堆叠非空值并处理索引值。

In [26]: list(df[df.notnull()].stack().index)
Out[26]: [(0L, '2'), (1L, '0'), (2L, '1')]

In [27]: df[df.notnull()].stack().index
Out[27]:
MultiIndex(levels=[[0, 1, 2], [u'0', u'1', u'2']],
           labels=[[0, 1, 2], [2, 0, 1]])

此外,使用堆栈方法,NaN 无论如何都会被忽略。

In [28]: list(df.stack().index)
Out[28]: [(0L, '2'), (1L, '0'), (2L, '1')]

【讨论】:

    【解决方案2】:

    获取非空位置:

    import numpy as np
    
    >>> np.argwhere(df.notnull().values).tolist()
    [[0, 2], [1, 0], [2, 1]]
    

    如果您真的希望它们作为元组对,只需使用列表推导:

    >>> [tuple(pair) for pair in np.argwhere(df.notnull().values).tolist()]
    [(0, 2), (1, 0), (2, 1)]
    

    获取空位置:

    >>> np.argwhere(df.isnull().values).tolist()
    [[0, 0], [0, 1], [1, 1], [1, 2], [2, 0], [2, 2]]
    

    【讨论】:

    • 可以将 numpy 数组转换为像 map(tuple, np.argwhere(df.notnull().values)) 这样的元组。但是,如果数据框具有非索引列名称,例如 [a, b, c] 等,则会出现这种方法的一个问题
    • 我更喜欢列表理解而不是地图。这将返回整数索引位置,而不是列/索引名称(顺便说一句,这很容易获得)。
    【解决方案3】:

    直接的方式:

    list(zip(*np.where(df.notnull())))
    

    [(0, 2), (1, 0), (2, 1)]
    

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 2021-12-13
      • 2020-04-11
      • 2019-06-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多