【问题标题】:Python - Iterate over dataframe and capture data in row above specific conditionPython - 迭代数据框并在特定条件上方的行中捕获数据
【发布时间】:2021-12-24 03:50:27
【问题描述】:

我正在尝试遍历数据框(行和列)并提取值为2 的最后一行,该值高于6。我所追求的示例如下:

输入数据帧

import pandas as pd
data = [{'c1':'a', 'c2':2}, {'c1':'b','c2':2}, {'c1':'c','c2':6},{'c1':'d','c2':6},{'c1':'e','c2':2},{'c1':'c','c2':6}]
df = pd.DataFrame(data)
    c1  c2
0   a   2
1   b   2
2   c   6
3   d   6
4   e   2
5   c   6

期望的输出:

0   b   2
1   e   2

我可以使用itterrows() 迭代行/列,但问题是我想在另一行之前获取值。为此,根据我的理解,我需要在 pandas 中使用 shift 函数。此函数仅适用于pd.series,不适用于完整数据帧。

还有其他方法可以做到这一点吗?请有人能指出我正确的方向吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe loops


    【解决方案1】:

    您可以使用shift 添加一个新列,告诉每一行下一行是否有6,然后很好地过滤

    import pandas as pd
    
    data = [{'c1': 'a', 'c2': 2}, {'c1': 'b', 'c2': 2}, {'c1': 'c', 'c2': 6},
            {'c1': 'd', 'c2': 6}, {'c1': 'e', 'c2': 2}, {'c1': 'c', 'c2': 6}]
    df = pd.DataFrame(data)
    df['is_six'] = df['c2'].shift(-1) == 6
    print(df)
    
    sub_df = df[(df['c2'] != 6) & df['is_six']].reset_index(drop=True)
    del sub_df['is_six']
    print(sub_df)
    
      c1  c2  is_six
    0  a   2   False
    1  b   2    True
    2  c   6    True
    3  d   6   False
    4  e   2    True
    5  c   6   False
    
      c1  c2
    0  b   2
    1  e   2
    

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 2021-11-17
      • 2019-07-08
      • 2021-11-27
      • 1970-01-01
      • 2021-05-10
      • 2020-02-24
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多