python - Pandas 按行查找第一个 nan 值并返回列名

标签 python pandas

我有一个这样的数据框

>>df1 = pd.DataFrame({'A': ['1', '2', '3', '4','5'],
              'B': ['1', '1', '1', '1','1'],
              'C': ['c', 'A1', None, 'c3',None],
              'D': ['d0', 'B1', 'B2', None,'B4'],
              'E': ['A', None, 'S', None,'S'],
              'F': ['3', '4', '5', '6','7'],
              'G': ['2', '2', None, '2','2']})
>>df1

   A  B     C     D     E  F     G
0  1  1     c    d0     A  3     2
1  2  1    A1    B1  None  4     2
2  3  1  None    B2     S  5  None
3  4  1    c3  None  None  6     2
4  5  1  None    B4     S  7     2

然后我删除包含 nan 值的行df2 = df1.dropna()

   A  B     C     D     E  F     G   
1  2  1    A1    B1  None  4     2
2  3  1  None    B2     S  5  None
3  4  1    c3  None  None  6     2
4  5  1  None    B4     S  7     2

这是一个丢弃的数据框,因为这些行包含 nan 值。 但是,我想知道为什么它们会被丢弃?哪一列是“第一个 nan 值列”使该行被删除?我需要一个放弃的举报理由。

输出应该是

['E','C','D','C']

我知道我可以对每一列执行 dropna 然后将其记录为原因 但它确实没有效率。

有没有更有效的方法来解决这个问题? 谢谢

最佳答案

我认为您可以通过 DataFrame.isnull 创建 bool 数据框,然后按 boolean indexing 过滤带有掩码,其中至少有一个 True by any最后idxmax - 你得到 DataFrame 的第一个 True 值的列名:

booldf = df1.isnull()
print (booldf)
       A      B      C      D      E      F      G
0  False  False  False  False  False  False  False
1  False  False  False  False   True  False  False
2  False  False   True  False  False  False   True
3  False  False  False   True   True  False  False
4  False  False   True  False  False  False  False

print (booldf.any(axis=1))
0    False
1     True
2     True
3     True
4     True
dtype: bool

print (booldf[booldf.any(axis=1)].idxmax(axis=1))
1    E
2    C
3    D
4    C
dtype: object

关于python - Pandas 按行查找第一个 nan 值并返回列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995707/

相关文章:

python - 使用 Flask 将任意值打印到 Web 服务器

python - 将文件添加到现有的 zipfile

python - iPython 中 Seaborn 统计数据可视化的默认字体

python - 有条件地设置 DataFrame 的非空值

python - 如何迭代 csv 文件的行并根据特定列的值删除

python - 努力使用面向数组的编程来实现循环

python - 将一个元素列表交换为 int

python - 运行 Python 脚本从 CNN 抓取新闻报道时没有得到任何输出

python - 将函数应用于我的数据框中的所有列

python - 用 Pandas 中的函数输出替换所有列值(以逗号分隔)