2015-04-07 51 views
1

我有以下的熊猫数据帧:如何计算两个Pandas数据框列之间的一致性?

t = pd.DataFrame({"u": ["S1", "S1", "S1", "S2", "S2", "S2", "S5", "S5", "S5"], 
        "v": ["a", "b", "a", "a", "b", "b", "b", "a", "a"], 
        "w": ["x", "z", "x", "x", "y", "y", "z", "x", "y"]}) 

我想计算列vw(类似的分类准确度)之间的协议,由u列分组。然而,列v中的值ab对应于列w(值z不对应于任何值)中的值xy。因此,我不能简单地比较这两列。

我做的是我在v列手动设置值,并w0ax),1by),和2z):

t.loc[t["v"] == "a", "v"] = 0 
t.loc[t["v"] == "b", "v"] = 1 
t.loc[t["w"] == "x", "w"] = 0 
t.loc[t["w"] == "y", "w"] = 1 
t.loc[t["w"] == "z", "w"] = 2 

现在我可以比较两列,按列u分组,如下所示:

t.groupby("u").agg(lambda x: np.mean(x["v"] == x["w"])) 

这给了我想要的结果,但我想知道是否有更简单的方法来实现相同的目的。

而且,我的解决方案不一样,如果我想计算np.corrcoef而不是np.mean工作,即

t.groupby("u").agg(lambda x: np.corrcoef(x["v"], x["w"])) 

给我一个错误。

回答

0

如果您先将“v”和“w”转换为数字类型,则基本上可以做您所尝试的。无论是'int'还是'float'都没有问题,但是我会用float来处理它们,因为你会把它们当作连续变量来处理,所以不妨明确说明它。

t[['v','w']] = t[['v','w']].astype(float) 

不要紧,你的平均计算,因为你刚刚产生,大熊猫解释为0/1布尔值。但对于相关系数,您需要提供数字。你还需要使用apply而非agg这里:

t.groupby("u").apply(lambda x: np.corrcoef(x["v"], x["w"])) 

但是,给你很多额外输出(2x2的,其中标量就足够了),所以我corr方法在这里使用的大熊猫:

t.groupby('u')['v'].corr(t['w']) 

u 
S1 1.000000 
S2 1.000000 
S5 0.866025 

根据您对问题的描述,我不确定'S1'和'S2'的相关系数1是否真的是您想要的,但是根据您将字母变量转换为数字变量,这是正确的结果。

+0

谢谢!你是对的,相关系数并不适合这种类型的问题(分类准确性可能是一个更好的方法,因为我想评估两个变量之间的一致性水平)。在相关说明中,我想知道是否可以通过在Pandas中使用新的因子类型以某种方式避免我的字符串/数字转换。 – cbrnr

+0

@ cle1109我不知道新的因子类型是什么。你是指分类变量吗? – JohnE

+0

是的,我指的是分类变量。我认为如果我分配了'a'和'x'级别0,'b'和'y'级别1(和'z'级别2)将字符串重新编码为数字是没有必要的。无论如何,我对建议的解决方案感到满意:-)。 – cbrnr

相关问题