在pandas中查找重叠列比率

时间:2018-03-08 19:07:14

标签: python pandas numpy

Dataframe(假设所有值都是分类的):

df = pd.DataFrame(
{"a" : [1 ,2, 3, 4, 5],
"b" : [2,1,3,4,5],
"c" : [1,3,4,2,5]},
index = [1, 2, 3, 4, 5])

我想找出不同列之间存在的重叠百分比

check_a_b = df.a == df.b
check_b_c = df.b == df.c
check_a_c = df.a == df.c

print(np.sum(check_a_b)/len(check_a_b)) # 0.6
print(np.sum(check_b_c)/len(check_b_c)) # 0.2
print(np.sum(check_a_c)/len(check_a_c)) # 0.4

矩阵/ DataFrame(三角矩阵)所需的最终输出:

    a    b    c
a       0.6   0.4 
b             0.2
c

现在,我希望以自动方式为15列实现此列,以获得超过100K行的数据。 这样做的优化方法是什么?

3 个答案:

答案 0 :(得分:2)

下降到numpy通常很有效。只有在得到结果时才返回pandas

from itertools import combinations

df = pd.DataFrame({"a" : [1 ,2, 3, 4, 5],
                   "b" : [2,1,3,4,5],
                   "c" : [1,3,4,2,5]},
                  index = [1, 2, 3, 4, 5])

a = df.values

d = {(i, j): np.mean(a[:, i] == a[:, j]) for i, j in combinations(range(a.shape[1]), 2)}

res, c, vals = np.zeros((a.shape[1], a.shape[1])), \
               list(map(list, zip(*d.keys()))), list(d.values())

res[c[0], c[1]] = vals

res_df = pd.DataFrame(res, columns=df.columns, index=df.columns)

#      a    b    c
# a  0.0  0.6  0.4
# b  0.0  0.0  0.2
# c  0.0  0.0  0.0

答案 1 :(得分:2)

您可以这样做的一种方法如下:

from itertools import combinations

df = pd.DataFrame({"a" : [1 ,2, 3, 4, 5],
                   "b" : [2,1,3,4,5],
                   "c" : [1,3,4,2,5]},
                  index = [1, 2, 3, 4, 5])

df_out = pd.DataFrame()
for i in combinations(df.columns, 2):
    s = pd.DataFrame((df[i[0]] == df[i[1]]).mean(),index=[i[0]], columns=[i[1]])
    df_out = pd.concat([df_out,s])

df_out.sum(level=0).reindex(df.columns).reindex(df.columns, axis=1).fillna(0)

输出:

     a    b    c
a  0.0  0.6  0.4
b  0.0  0.0  0.2
c  0.0  0.0  0.0

答案 2 :(得分:1)

正在进行中

$state.go

更新:Scott提及

更改为function myFunction(id) { $state.go('providerDetail', { id: id}) }

$state