Python 使用Numpy数组或Pandas数据帧查找满足条件的第一行。(可能很棘手)
我将以图书馆不可知论的方式提出这个问题,因为在这种情况下,一个可能比另一个好。或者可能存在另一个神奇的图书馆 我有一个大约10000条记录的DB表,我知道如何从中创建numpy数组或数据帧。数据是这样的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 ... 在
...
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
我知道如何在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
我想:
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小时内尝试。