【发布时间】:2021-04-17 22:25:12
【问题描述】:
我目前有一个超过 100,000 行和 100 多列的数据框 dta,其中 dta[i, j] 是一个元素列表。我的目标是计算一个对称表a,其中a[i,j] = mean([len(intersect(dta[k, i],dta[k, j]))]),即,对于每两列,计算成对交集数,然后取所有行的平均值。
创建示例的简单代码是
dta = pd.DataFrame(
{
"a" : ["a", "b", "a", "a", "b", "a"],
"b" : ["a", "b", "a","a", "b", "a"],
"c" : ["a", "ee", "c","a", "b", "a"],
"d" : ["aaa b", "bbb a", "ccc c","a", "b", "a"]
}
)
dta = dta.applymap(lambda x : x.split() )
table = pd.DataFrame(np.zeros((4,4)))
for i in range(4) :
for j in range(i, 4) :
table.iloc[i,j] = dta.apply(
lambda x : len(set(x[i]).intersection(set(x[j]))), axis=1
).mean()
table
示例输入是
a b c d
0 [a] [a] [a] [aaa, b]
1 [b] [b] [ee][bbb, a]
2 [a] [a] [c] [ccc, c]
3 [a] [a] [a] [a]
4 [b] [b] [b] [b]
5 [a] [a] [a] [a]
输出是
0 1 2 3
0 1.0 1.0 0.666667 0.500000
1 0.0 1.0 0.666667 0.500000
2 0.0 0.0 1.000000 0.666667
3 0.0 0.0 0.000000 1.500000
我目前的方法如下:
def func(row, col1, col2) -> float :
list1, list2 = row[col1], row[col2]
return len(set(list1).intersection(list2))
for col_id, col in enumerate(colnames) :
for tgt_col_id in range(col_id, col_num) :
a.loc[col_id, tgt_col_id] = (
dta.apply(func, args=(col, colnames[tgt_col_id]), axis=1
).mean()
我的想法是我可能会加快列循环中的多处理,因为每个对操作并不重合。但是有没有numpy / pandas 的方式来加快两列之间的操作?
加快处理速度的想法会有所帮助!
【问题讨论】:
-
请提供带有预期输出数据框的示例数据框
-
展示您想要实现的目标的最小示例将非常有帮助。
标签: python pandas dataframe numpy