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