我有两个表/ pandas DataFrames。需要分类的table1
,即根据class
至a
中的数据填充列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行中表示:
另一个困难是,列数是任意的。因此该解决方案应适用于不同的表大小。
我可以简单地遍历两个表并按行和分类进行测试,但这将非常低效。有没有更优雅的类似熊猫的解决方案?
答案 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