我有多个表格,如下所示。
有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天。
答案 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]