Python 在特定列的数据帧中的其他值之间查找值

Python 在特定列的数据帧中的其他值之间查找值,python,pandas,dataframe,Python,Pandas,Dataframe,我正试图找到一种合并两个数据帧的方法。每个数据帧使用两列创建唯一标识符。在主数据框中,为给定的值范围分配数据;在类别数据框中,为单个值分配数据。我想做的是从主数据框中获取类别数据框中每个条目的类型值 这很难解释,所以这里有一个简单的例子: master = {'ID1':['a','a','b','b','b','b','b','c','c'], 'ID2':['d','d','d','d','d','e','e','d','e'], 'RangeTop':[0,4,

我正试图找到一种合并两个数据帧的方法。每个数据帧使用两列创建唯一标识符。在主数据框中,为给定的值范围分配数据;在类别数据框中,为单个值分配数据。我想做的是从主数据框中获取类别数据框中每个条目的类型值

这很难解释,所以这里有一个简单的例子:

master = {'ID1':['a','a','b','b','b','b','b','c','c'],
       'ID2':['d','d','d','d','d','e','e','d','e'],
       'RangeTop':[0,4,0,3,10,0,5,0,0],
       'RangeBot':[4,13,3,10,21,5,11,8,15],
       'Type':['z','y','x','w','v','u','t','s','r']
       }
category = {'ID1':['a','a','b','b','c','c'],
       'ID2':['d','d','d','e','d','e'],
       'Value':[3,8,11,7,6,13]
       }
df = pd.DataFrame(master, columns = ['ID1', 'ID2', 'RangeTop','RangeBot','Type'])
df2 = pd.DataFrame(category, columns = ['ID1', 'ID2', 'Value'])
df['Unique'] = df['ID1']+df['ID2']
df2['Unique'] = df2['ID1']+df2['ID2']
print(df, '\n', df2)
输出如下所示:

master
   ID1 ID2  RangeTop  RangeBot Type Unique
0   a   d         0         4    z     ad
1   a   d         4        13    y     ad
2   b   d         0         3    x     bd
3   b   d         3        10    w     bd
4   b   d        10        21    v     bd
5   b   e         0         5    u     be
6   b   e         5        11    t     be
7   c   d         0         8    s     cd
8   c   e         0        15    r     ce 
 category
   ID1 ID2  Value Unique
0   a   d      3     ad
1   a   d      8     ad
2   b   d     11     bd
3   b   e      7     be
4   c   d      6     cd
5   c   e     13     ce
我创建了Unique列,因为我想也许我可以使用between方法或where方法来查找某些唯一标识符的RangeTop和RangeBot之间的值,但它不起作用。 我希望它看起来像是:

 category
   ID1 ID2  Value Unique Type
0   a   d      3     ad   z
1   a   d      8     ad   y
2   b   d     11     bd   v
3   b   e      7     be   t
4   c   d      6     cd   s
5   c   e     13     ce   r

您应该看看merge函数:

merged = df1.merge(df2, left_on=["ID1", "ID2"], right_on=["ID1", "ID2"])

如果您只需要一些列,请在合并之前或之后使用drop方法。

您应该看看合并功能:

merged = df1.merge(df2, left_on=["ID1", "ID2"], right_on=["ID1", "ID2"])

如果您只需要一些列,请在合并之前或之后使用drop方法。

因为
df
具有完整且不重叠的范围,您可以使用
pd执行此操作。合并asof
以在ID上精确匹配,然后获取范围之间的值。我们将需要一个额外的
,因为
df
具有完整且不重叠的范围。您可以使用
pd进行此操作。合并asof
以在ID上精确匹配,然后获得范围之间的值。我们还需要一个附加的
,这并不能解决以下问题:对于ID1和ID2的唯一组合,如果df1中的值介于RangeTop和RangeBot之间,则必须检索df1中的类型。然后,我需要删除值不在RangeTop和RangeBot之间的行,我也不知道如果不使用大循环,该怎么做。你很接近了。在此合并之后,您将使用一个
merged[merged['Value'].ge(merged.RangeTop)&merged['Value'].lt(merged.RangeBot)]
只将值位于范围之间的行子集。这允许值与多个范围匹配,但也可能会丢失
df2
中的行,这些行完全超出
df
中的任何范围。这并不能解决以下问题:对于ID1和ID2的唯一组合,如果df1中的值介于RangeTop和RangeBot之间,则必须检索df1中的类型。然后,我需要删除值不在RangeTop和RangeBot之间的行,我也不知道如果不使用大循环,该怎么做。你很接近了。在此合并之后,您将使用一个
merged[merged['Value'].ge(merged.RangeTop)&merged['Value'].lt(merged.RangeBot)]
只将值位于范围之间的行子集。这允许值与多个范围相匹配,但也会导致您在
df2
中丢失完全超出
df
中任何范围的行。这些范围的结尾是什么,是[RangeTop,RangeBot]吗?这些范围的结尾是什么[RangeTop,RangeBot)?这对我很有效。我不确定你的第二行(df2['Type']语句。强制是什么意思?@mylesmoose假设您在
df2
中有一行ID1='a',ID2='d',值为476。因为
asof
合并是向后的,所以该行将与
df
中的4-13范围匹配(因为在该组中,4是“最接近的”向后匹配)。合并没有强制它位于范围之间。第二行实质上增加了该约束,因此它会将上面的错误匹配变成
NaN
@mylesmoose。如果
df
的范围足够完整,可以覆盖
df2
中找到的组中的所有值,则该行作为
1:1
反向asof合并将是等效的逻辑。但我认为这是一个相当有力的假设。这对我很有效。我不确定你的第二行(df2['Type']语句。强制是什么意思?@mylesmoose假设您在
df2
中有一行ID1='a',ID2='d',值为476。因为
asof
合并是向后的,所以该行将与
df
中的4-13范围匹配(因为在该组中,4是“最接近的”向后匹配)。合并没有强制它位于范围之间。第二行实质上增加了该约束,因此它会将上面的错误匹配变成
NaN
@mylesmoose。如果
df
的范围足够完整,可以覆盖
df2
中找到的组中的所有值,则该行作为
1:1
反向asof合并将是等效的逻辑。但我认为这是一个相当有力的假设。
print(df2)
# Note row order has changed due to `sort`ing

  ID1 ID2  Value Type
0   a   d      3    z
1   c   d      6    s
2   b   e      7    t
3   a   d      8    y
4   b   d     11    v
5   c   e     13    r