计算数据框之间的公共列值(Python)

时间:2018-08-23 06:17:20

标签: python pandas

我有多个表格,如下所示。
有10个df表,行的范围为1000-25,000行。
这些df表是在将它们聚类后生成的。因此,行数不同。

  df = pd.DataFrame({'id': [1,2,3,4,5], 'segments' : ["a,b,c", "c,a", "d,a,b", "e,g", "a,e,d"]})
  ref = pd.DataFrame({'id': [1,4], 'segments' : ["a,b,c", "e,g"]})
     | id | segments |
+----+----+----------+
| 0  | 1  | a,b,c    |
| 1  | 2  | c,a      | 
| 2  | 3  | d,a,b    | 
| 3  | 4  | e,g      | 
| 4  | 5  | a,e,d    | 
+----+----+----------+  ....total 1500-25,000 rows (10 df tables)


     | id | segments |
+----+----+----------+
| 0  | 1  | a,b,c    |
| 1  | 4  | e,g      | 
+----+----+----------+.....total 1216 rows

我的目的是确定每个df表中是否存在引用ID。
如果是,我需要检查每个df表的每一行并计算多少段相同。
我的最终输出将如下所示。

     | id | segments |ref_1  | ref_2
+----+----+----------+-------+-----+
| 0  | 1  | a,b,c    | 3     |  0  |
| 1  | 2  | c,a      | 2     |  0  |
| 2  | 3  | d,a,b    | 2     |  0  |
| 3  | 4  | e,g      | 0     |  2  |
| 4  | 5  | a,e,d    | 1     |  1  |
+----+----+----------+-------+-----+

到目前为止,我已经确定了如何检查参考ID是否存在

# get the ref id present in df
for index, row in enumerate(df.id):
    for index2, row2 in enumerate(ref.id):
        if row == row2:
            print("ref id present")
            print(row,index)
        else:
            "no ref id"

我尝试使用交集功能。但是我得到了输出0。

len(set(df['segments']).intersection(set(ref['segments'])))

我进行了研究,但是大多数解决方案都涉及单列值,使用合并可以解决该问题。但是,我的1列中有多个值。
我在如何检查和计算通用值并将其全部放入10 df表的循环中停留了2天。

1 个答案:

答案 0 :(得分:1)

我认为需要使用split创建集合,然后按set.intersection进行比较:

segments = [set(x.split(',')) for x in df['segments']]
ref = [set(x.split(',')) for x in ref['segments']]

for i, x in enumerate(ref, 1):
    df['ref_{}'.format(i)] = [len(y.intersection(x)) for y in segments]
print (df)
   id segments  ref_1  ref_2
0   1    a,b,c      3      0
1   2      c,a      2      0
2   3    d,a,b      2      0
3   4      e,g      0      2
4   5    a,e,d      1      1

如果性能很重要,则另一个解决方案(O(n)):

for i, x in enumerate(ref, 1):
    df['ref_{}'.format(i)] = [len([val for val in x if val in y]) for y in segments]