2017-01-11 75 views
0

我有两个数据帧,我想将一个数据帧与另一个数据帧进行比较,并根据比较结果在第一个列中添加“真/假”。熊猫:基于两个DF的比较添加新列

我的数据类似:

DF1:

 cat sub-cat low  high 
3  3  1  208  223 
4  3  1  224  350 
8  4  1  223  244 
9  4  1  245  350 
13  5  1  232  252 
14  5  1  253  350 

DF2:

 Cat Sub-Cat Rating 
0  5  1   246 
1  5  2   239 
2  8  1   203 
3  8  2   218 
4  K  1   149 
5  K  2   165 
6  K  1   171 
7  K  2   185 
8  K  1   157 
9  K  2   171 

期望的结果将是DF2有一个额外的柱,用真或假取决于如果,基于cat和sub-cat,评级介于low.min()和high.max()之间,如果没有匹配,则为Null。

这段时间已经运行了太久,没有结果可言。

非常感谢您的帮助。

更新:

第一行会看起来像:

 Cat Sub-Cat Rating In-Spec 
0  5  1   246 True 

它落在分钟低和最大高度之内。

示例:DF1中有两行cat = 5和sub-cat = 2。我需要从这两行中获取最小值和最大值,然后检查DF2中第0行的额定值是否下降内的最小低,最大在DF1

+2

请告诉我们你认为结果应该是第一行。 – piRSquared

+0

当然,我的道歉。 – bmeredith

+0

你想评估/比较哪一行?那些具有相同索引或具有相同的猫和子猫的? – saitam

回答

2

joingroupby.agg

d2 = DF2.join(
    DF1.groupby(
     ['cat', 'sub-cat'] 
    ).agg(dict(low='min', high='max')), 
    on=['Cat', 'Sub-Cat'] 
) 
d2 

    Cat Sub-Cat Rating high low 
0 5  1  246 350.0 232.0 
1 5  2  239 NaN NaN 
2 8  1  203 NaN NaN 
3 8  2  218 NaN NaN 
4 K  1  149 NaN NaN 
5 K  2  165 NaN NaN 
6 K  1  171 NaN NaN 
7 K  2  185 NaN NaN 
8 K  1  157 NaN NaN 
9 K  2  171 NaN NaN 

分配与.loc

DF2.loc[d2.eval('low <= Rating <= high'), 'In-Spec'] = True 
DF2 

    Cat Sub-Cat Rating In-Spec 
0 5  1  246 True 
1 5  2  239  NaN 
2 8  1  203  NaN 
3 8  2  218  NaN 
4 K  1  149  NaN 
5 K  2  165  NaN 
6 K  1  171  NaN 
7 K  2  185  NaN 
8 K  1  157  NaN 
9 K  2  171  NaN 
+0

这是美丽的。谢谢。 – bmeredith

+0

@bmeredith欢迎您! – piRSquared

0

两个匹配的行高,以添加基于布尔表达式的新列将涉及沿东西线:

temp = boolean code involving inequality 
df2['new column name'] = temp 

但是我不知道我理解,例如DF2表中的第一行的评分为246,这意味着对于DF1的第13行是正确的,而对于第14行是错误的。您想要什么? o返回?

+0

一旦发现对猫/子猫的真实性,我需要确保该评级落在DF1中相应行的最小和最大范围内。数据与第13行和第14行一样成对出现,但我需要将它们与最低和最高的高价进行比较。 – bmeredith

+0

您可以使用df1.groupby(['cat,'sub-cat'])[low] .min()[high] .max()在DF1上使用groupby来创建一个新的数据帧,其中每个数据帧的最大值和最小值对猫和分猫 –

0

你可以像下面这样做

df2['In-Spec'] = 'False' 
df2['In-Spec'][(df2['Rating'] > df1['low']) & (df2['Rating'] < df1['high'])] = 'True' 

但是应该将哪些行与其他行进行比较?你想让他们通过他们的索引或他们的猫&子名称进行比较吗?