我有一个包含4列的数据框
数据框1:
column_A column_B column_C id
0 1 1 anna 123
1 2 1 anna 7
2 30 2 bob 42
3 20 2 bob 12
4 10 2 charlie 1
5 100 3 charlie 2
现在,我想计算一个具有以下属性的新数据框(数据框2)
id_1 id_2 val
0 123 7 1
1 42 12 1
2 42 1 2
3 12 1 2
4 1 2 3
val == 1,如果column_B和column_C中的所有行两者都对应都匹配
val == 2,如果跨行仅column_B中的相应值匹配
val == 3,如果跨行 column_C中只有对应的值匹配
我当前的实现是O(N ^ 2)。考虑到数据帧很大,是否可以使用一些并行化来加快处理速度。
我们还可以将问题解释为在Pandas数据框中找到一对行索引,其中column_B,column_C中的值相同。 示例:row [0]和row [1]在column_B和column_C中具有相同的值
答案 0 :(得分:0)
我的方法如下:
import numpy as np
import itertools as it
df2 = pd.DataFrame(np.array(list(it.combinations(df.id, 2))), columns=['id_1', 'id_2'])
id_1 id_2
0 123 7
1 123 42
2 123 12
3 123 1
4 123 2
5 7 42
6 7 12
7 7 1
8 7 2
9 42 12
10 42 1
11 42 2
12 12 1
13 12 2
14 1 2
rules = lambda x: abs(
(df[df.id==x[0]].column_C.values == df[df.id==x[1]].column_C.values).all()*3 -
(df[df.id==x[0]].column_B.values == df[df.id==x[1]].column_B.values).all()*2)
df2['val'] = df2.apply(rules, axis=1)
df2[df2.val>0]
id_1 id_2 val
0 123 7 1
1 42 12 1
2 42 1 2
3 12 1 2
4 1 2 3
这个想法是要计算“ if-C匹配乘以3减去if-B匹配乘以2”的绝对值。
即:
都匹配:|3 - 2| = 1
仅C:|3 - 0| = 3
仅B:|0 - 2| = 2
没有匹配项:|0 - 0| = 0
如果您要求一列匹配为val = 1,另一列val = 2,则总和将为1 + 2 = 3,那么lambda公式会更简单(“ if-B-匹配时间1加上if-C匹配时间2“)-但这只是一些简单的运算符及其顺序的问题。