【问题标题】:df.apply() but skip the first rowdf.apply() 但跳过第一行
【发布时间】:2021-01-29 09:37:36
【问题描述】:

我正在尝试将以下 df.apply 命令应用于数据帧,但希望它跳过第一行。关于如何在不将第一行设置为列标题的情况下如何做到这一点的任何建议?

res = sheet1[sheet1.apply(lambda row: row.astype(str).str.contains('TRUE', case=False).any(), axis=1)]

【问题讨论】:

  • 如果要指定行,请使用 iloc。具体来说, sheet[sheet1.iloc[1:, :].apply()]
  • 您只是想要一个系列作为输出(并且不在乎它的索引是否被删除并且输出使用整数作为索引),还是您想将该结果重新分配回数据帧(即保留原始索引)?

标签: python pandas dataframe


【解决方案1】:

您可以从索引一开始选择如下:

res = sheet1[1:].apply(lambda row: row.astype(str).str.contains('TRUE', case=False).any(), axis=1)

【讨论】:

    【解决方案2】:

    编辑版本 3:

    import pandas as pd
    import random
    df = pd.DataFrame({'a':range(1,11), 'b':range(2,21,2), 'c':range(1,20,2),
        'd':['TRUE' if random.randint(0,1) else 'FALSE' for _ in range(10)]})
    print (df)
    
    
    res = df[df.apply(lambda row: row.astype(str).str.contains('TRUE', case=False).any(), axis=1)]
    
    print (res.loc[1:])
    

    如果您只想获取从 1 开始的行,则可以如上所示:

    输入的Dataframe是:

        a   b   c      d
    0   1   2   1   TRUE
    1   2   4   3  FALSE
    2   3   6   5  FALSE
    3   4   8   7   TRUE
    4   5  10   9   TRUE
    5   6  12  11   TRUE
    6   7  14  13  FALSE
    7   8  16  15  FALSE
    8   9  18  17   TRUE
    9  10  20  19   TRUE
    

    res 的输出将是:

        a   b   c     d
    0   1   2   1  TRUE
    3   4   8   7  TRUE
    4   5  10   9  TRUE
    5   6  12  11  TRUE
    8   9  18  17  TRUE
    9  10  20  19  TRUE
    

    res[1:] 的输出 - 不包括第一行将是:

        a   b   c     d
    3   4   8   7  TRUE
    4   5  10   9  TRUE
    5   6  12  11  TRUE
    8   9  18  17  TRUE
    9  10  20  19  TRUE
    

    编辑版本 2:

    这是一个在列中包含'TRUE''FALSE' 的示例。

    import pandas as pd
    import random
    df = pd.DataFrame({'a':['TRUE' if random.randint(0,1) else 'FALSE' for _ in range(10)]})
    print (df)
    
    res = df.iloc[1:].apply(lambda row: row.astype(str).str.contains('TRUE', case=False).any(), axis=1)
    
    print (res)
    

    输出将是:

    原始数据框:

           a
    0   TRUE
    1   TRUE
    2  FALSE
    3  FALSE
    4  FALSE
    5   TRUE
    6   TRUE
    7  FALSE
    8  FALSE
    9  FALSE
    

    DataFrame 的结果:

    1     True
    2    False
    3    False
    4    False
    5     True
    6     True
    7    False
    8    False
    9    False
    dtype: bool
    

    你也可以用 loc 代替 iloc:

    res = df.loc[1:].apply(lambda row: row.astype(str).str.contains('TRUE', case=False).any(), axis=1)
    

    如您所见,它跳过了第一行。

    旧答案

    这是一个例子:

    import pandas as pd
    df = pd.DataFrame({'a':range(1,11), 'b':range(2,21,2), 'c':range(1,20,2)})
    print (df)
    
    res = df.iloc[1:,:].apply(lambda x: x+10,axis=1)
    print (res)
    

    原始数据框:

        a   b   c
    0   1   2   1
    1   2   4   3
    2   3   6   5
    3   4   8   7
    4   5  10   9
    5   6  12  11
    6   7  14  13
    7   8  16  15
    8   9  18  17
    9  10  20  19
    

    只有第 1 行以后被修改:

        a   b   c
    1  12  14  13
    2  13  16  15
    3  14  18  17
    4  15  20  19
    5  16  22  21
    6  17  24  23
    7  18  26  25
    8  19  28  27
    9  20  30  29
    

    【讨论】:

    • 我试过了,但一直收到“IndexingError:作为索引器提供的不可对齐的布尔系列(布尔系列的索引和索引对象的索引不匹配)。”作为一个错误。这是我的行 res = sheet1[sheet1.iloc[1:].apply(lambda row: row.astype(str).str.contains('TRUE', case=False).any(), axis=1)]
    • 你想把这些数据的子集返回到 res 中还是只是它的布尔值?
    猜你喜欢
    • 2014-06-07
    • 2013-08-17
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多