Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Numpy数组或Pandas数据帧查找满足条件的第一行。(可能很棘手)_Python_Pandas_Numpy Ndarray - Fatal编程技术网

Python 使用Numpy数组或Pandas数据帧查找满足条件的第一行。(可能很棘手)

Python 使用Numpy数组或Pandas数据帧查找满足条件的第一行。(可能很棘手),python,pandas,numpy-ndarray,Python,Pandas,Numpy Ndarray,我将以图书馆不可知论的方式提出这个问题,因为在这种情况下,一个可能比另一个好。或者可能存在另一个神奇的图书馆 我有一个大约10000条记录的DB表,我知道如何从中创建numpy数组或数据帧。数据是这样的 ... 20,25,1,5 20,25,2,3 20,25,4,21 20,25,5,1 20,25,9,19 ... 45,47,6,20 45,47,10,2 45,47,11,56 45,47,21,41 ... 在

我将以图书馆不可知论的方式提出这个问题,因为在这种情况下,一个可能比另一个好。或者可能存在另一个神奇的图书馆

我有一个大约10000条记录的DB表,我知道如何从中创建numpy数组或数据帧。数据是这样的

   ...
   20,25,1,5
   20,25,2,3
   20,25,4,21
   20,25,5,1
   20,25,9,19
   ...
   45,47,6,20
   45,47,10,2
   45,47,11,56
   45,47,21,41
   ...
在下面的示例搜索条件中,我位于此行col4中的值“20”之后

45,47,6,20
  • 请注意,前两列具有相同的值并定义了一个组
  • Col2在一行中始终大于等于col1
  • col3中的值在一个组中总是以升序排列,不一定是连续的
  • 我使用以下搜索条件查找col4中单元格的值


    我知道如何在numpy中使用掩码来查找值为eg'col1>=45和col2=45以及col2的所有行。我建议对前三列使用多索引,并在此多索引上使用掩码,如下所示:

    # I reproduce a similar dataframe
    import pandas as pd
    import numpy as np
    np.random.seed(123)
    v1 = np.random.randint(0, 10, 10)
    v2 = v1 + 2
    v3 = np.random.randint(0, 10, 10)
    v4 = np.random.randint(0, 10, 10)
    df = pd.DataFrame({"v1": v1,
                       "v2": v2,
                       "v3": v3,
                       "v4": v4})
    # and sort it according to your comments
    df = df.sort_values(by=["v1", "v2", "v3"])
    df.head()
    
              v4
    v1 v2 v3    
    2  4  0    3
    1  3  9    4
          1    7
          0    8
    0  2  4    0
    
    我得到以下数据帧:

      v1  v2  v3  v4
    8   0   2   4   0
    7   1   3   0   8
    9   1   3   1   7
    3   1   3   9   4
    1   2   4   0   3
    
    您的数据帧现在如下所示:

    # I reproduce a similar dataframe
    import pandas as pd
    import numpy as np
    np.random.seed(123)
    v1 = np.random.randint(0, 10, 10)
    v2 = v1 + 2
    v3 = np.random.randint(0, 10, 10)
    v4 = np.random.randint(0, 10, 10)
    df = pd.DataFrame({"v1": v1,
                       "v2": v2,
                       "v3": v3,
                       "v4": v4})
    # and sort it according to your comments
    df = df.sort_values(by=["v1", "v2", "v3"])
    df.head()
    
              v4
    v1 v2 v3    
    2  4  0    3
    1  3  9    4
          1    7
          0    8
    0  2  4    0
    

    我建议对前三列使用多索引,并在此多索引上使用掩码,如下所示:

    # I reproduce a similar dataframe
    import pandas as pd
    import numpy as np
    np.random.seed(123)
    v1 = np.random.randint(0, 10, 10)
    v2 = v1 + 2
    v3 = np.random.randint(0, 10, 10)
    v4 = np.random.randint(0, 10, 10)
    df = pd.DataFrame({"v1": v1,
                       "v2": v2,
                       "v3": v3,
                       "v4": v4})
    # and sort it according to your comments
    df = df.sort_values(by=["v1", "v2", "v3"])
    df.head()
    
              v4
    v1 v2 v3    
    2  4  0    3
    1  3  9    4
          1    7
          0    8
    0  2  4    0
    
    我得到以下数据帧:

      v1  v2  v3  v4
    8   0   2   4   0
    7   1   3   0   8
    9   1   3   1   7
    3   1   3   9   4
    1   2   4   0   3
    
    您的数据帧现在如下所示:

    # I reproduce a similar dataframe
    import pandas as pd
    import numpy as np
    np.random.seed(123)
    v1 = np.random.randint(0, 10, 10)
    v2 = v1 + 2
    v3 = np.random.randint(0, 10, 10)
    v4 = np.random.randint(0, 10, 10)
    df = pd.DataFrame({"v1": v1,
                       "v2": v2,
                       "v3": v3,
                       "v4": v4})
    # and sort it according to your comments
    df = df.sort_values(by=["v1", "v2", "v3"])
    df.head()
    
              v4
    v1 v2 v3    
    2  4  0    3
    1  3  9    4
          1    7
          0    8
    0  2  4    0
    
    我想:

  • 筛选数据帧以仅保留与条件匹配的行
  • 前2列上的groupby
  • 对每组应用
    tail(1)
    ,以查找每组的相关行(如果有)
  • 代码为:

    df[(df['col1']>=45)&(df['col2']<=47)&(df['col3']<=8)].groupby(['col1', 'col2']
                                                                  ).tail(1)
    
    好消息是,您可以在一次过程中搜索多个组,如果没有符合条件的行,它仍然会给出预期的结果。演示:

    >>> df[(df['col1']>=20)&(df['col2']<=47)&(df['col3']<=8)].groupby(['col1', 'col2']).tail(1)
       col1  col2  col3  col4
    3    20    25     5     1
    5    45    47     6    20
    >>> df[(df['col1']>=20)&(df['col2']<=47)&(df['col3']<=3)].groupby(['col1', 'col2']).tail(1)
       col1  col2  col3  col4
    1    20    25     2     3
    >>> df[(df['col1']>=45)&(df['col2']<=47)&(df['col3']<=3)].groupby(['col1', 'col2']).tail(1)
    Empty DataFrame
    Columns: [col1, col2, col3, col4]
    Index: []
    
    >>df[(df['col1']>=20)和(df['col2']>df[(df['col1']>=20)和(df['col2']>df[(df['col1']>=45)和(df['col2']

  • 筛选数据帧以仅保留与条件匹配的行
  • 前2列上的groupby
  • 对每组应用
    tail(1)
    ,以查找每组的相关行(如果有)
  • 代码为:

    df[(df['col1']>=45)&(df['col2']<=47)&(df['col3']<=8)].groupby(['col1', 'col2']
                                                                  ).tail(1)
    
    好消息是,您可以一次搜索多个组,如果没有符合条件的行,它仍然会给出预期的结果。演示:

    >>> df[(df['col1']>=20)&(df['col2']<=47)&(df['col3']<=8)].groupby(['col1', 'col2']).tail(1)
       col1  col2  col3  col4
    3    20    25     5     1
    5    45    47     6    20
    >>> df[(df['col1']>=20)&(df['col2']<=47)&(df['col3']<=3)].groupby(['col1', 'col2']).tail(1)
       col1  col2  col3  col4
    1    20    25     2     3
    >>> df[(df['col1']>=45)&(df['col2']<=47)&(df['col3']<=3)].groupby(['col1', 'col2']).tail(1)
    Empty DataFrame
    Columns: [col1, col2, col3, col4]
    Index: []
    

    >>df[(df['col1']>=20)和(df['col2']>df[(df['col1']>=20)和(df['col2']>df[(df['col1']>=45)和(df['col2']请发布您的预期输出。以相同的方式发布您的原始数据框架请发布您的预期输出。以相同的方式发布您的原始数据框架抱歉,但我需要使用数据和搜索条件1,3,2的第1,3,1,7行,因为按降序搜索1,3组将导致v3=1单元格作为第一个值@notintox I modi将答案按降序排列索引。因此,您可以按您希望的顺序搜索多索引。非常感谢@Raphaele Adjerad。我将消化您的代码并查看结果。但首先我必须执行一些其他编码。很遗憾,我将在24小时内尝试。很抱歉,我需要使用您的数据和搜索标准搜索第1、3、1、7行ia为1,3,2,因为按降序搜索1,3组将导致v3=1单元格作为第一个值@notintox,我修改了答案以降序排序索引。因此,您可以按您想要的顺序搜索多索引。非常感谢@Raphaele Adjerad。我将消化您的代码,看看如何处理。但是rst我不得不做一些其他的编码不幸的。将在24小时内尝试。