【问题标题】:drop all rows after first occurance of NaN in specific column (pandas)在特定列(熊猫)中首次出现 NaN 后删除所有行
【发布时间】:2017-09-22 03:11:51
【问题描述】:

我正在尝试在 pandas 中使用 dropna 函数。我想将它用于特定的列。

如果所有行都有所有 NaN 值,我只能弄清楚如何使用它来删除 NaN。

我有一个数据框(见下文),我想在 特定 列“A”列中第一次出现 NaN 后删除所有行

当前代码,仅当所有行值为 NaN 时才有效。

data.dropna(axis = 0, how = 'all')
data

原始数据框

    data = pd.DataFrame({"A": (1,2,3,4,5,6,7,"NaN","NaN","NaN"),"B": (1,2,3,4,5,6,7,"NaN","9","10"),"C": range(10)})
    data


    A   B   C
0   1   1   0
1   2   2   1
2   3   3   2
3   4   4   3
4   5   5   4
5   6   6   5
6   7   7   6
7   NaN NaN 7
8   NaN 9   8
9   NaN 10  9

我希望输出的样子:

    A   B   C
0   1   1   0
1   2   2   1
2   3   3   2
3   4   4   3
4   5   5   4
5   6   6   5
6   7   7   6

对此的任何帮助表示赞赏。 显然,我想以最干净、最有效的方式做到这一点。

谢谢!

【问题讨论】:

    标签: python pandas nan


    【解决方案1】:

    使用iloc + argmax

    data.iloc[:data.A.isnull().values.argmax()]
    
         A  B  C
    0  1.0  1  0
    1  2.0  2  1
    2  3.0  3  2
    3  4.0  4  3
    4  5.0  5  4
    5  6.0  6  5
    6  7.0  7  6
    

    或使用不同的语法

    top_data = data[:data['A'].isnull().argmax()]
    

    【讨论】:

    • @MaxU 差不多,这取决于索引是有序的整数。我用另一种方式修复了它。
    • loc + idxmax 有什么问题?另外我认为你不需要.valuesSeries 也有argmax 方法。
    • loc 采用两个端点。 idxmax 返回nan 第一次发生的索引,并包含在loc 的结果中。 MaxU 首先建议使用+1,但如果索引不是方便排序的整数,这并不能一概而论。 iloc 不包括终点,但现在我必须找到位置而不是索引。所以我不得不使用argmax
    • 感谢@piRSquared 是的,到目前为止它运行良好。是的,在我的实际工作数据框中,它是整数和字符串的混合体(我应该在示例中放置一些字符串)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2019-08-13
    • 2023-01-28
    相关资源
    最近更新 更多