使用另一个数据框对熊猫数据框进行分类

时间:2018-07-15 01:53:13

标签: python pandas dataframe comparison

我有两个表/ pandas DataFrames。需要分类的table1,即根据classa中的数据填充列c ...

  a b c class1 class2 class3
0 2 3 4  ???    ???    ???
1 3 5 0  ???    ???    ???
2 9 8 2  ???    ???    ???

...和提供分类规则的table2

        a   a   b   b   c   c   
       min max min max min max  
class1  0   9   0   9   0   9  
class2  1   3   4   5   0   1
class3  1   5   3   9   1   3

因此,目标是通过比较列a至c是否都位于table1的最小值和最大值之间来补充table2中每一行的分类。结果将如下所示:

  a b c class1 class2 class3
0 2 3 4  True  False  False 
1 3 5 0  True  True   False
2 9 8 2  True  False  False

在第0行中表示:

  • class1:0 <= a <= 9和0 <= b <= 9和0 <= c <= 9是True
  • class2:1 <= a <= 3和4 <= b <= 5和0 <= c <= 1是False
  • class3:1 <= a <= 5和3 <= b <= 9和1 <= c <= 3是False

另一个困难是,列数是任意的。因此该解决方案应适用于不同的表大小。

我可以简单地遍历两个表并按行和分类进行测试,但这将非常低效。有没有更优雅的类似熊猫的解决方案?

1 个答案:

答案 0 :(得分:0)

您可以使用numpy广播

minV=df2.loc[:,pd.IndexSlice[:,'min']].values
maxV=df2.loc[:,pd.IndexSlice[:,'max']].values
v=((df1.values-minV[:,None])>=0)&((df1.values-maxV[:,None])<=0)

np.all(v,-1).T
Out[251]: 
array([[ True, False, False],
       [ True,  True, False],
       [ True, False, False]])

然后连住

pd.concat([df1,pd.DataFrame(np.all(v,-1).T,columns=['class1','class2','class3'],index=df1.index)],axis = 1)
Out[254]: 
   a  b  c  class1  class2  class3
0  2  3  4    True   False   False
1  3  5  0    True    True   False
2  9  8  2    True   False   False