我有两列input file1
(制表符分隔):
c1\tc2
aaa\t232 65 19 32
bbew\t32 22 20
jhsi\t986 1 32 463 221
和input file2
都有一列:
c1
19
1
32
277
我想要的是从file2
中的file1
中搜索一个元素,然后在c1
中返回相应的值。如果匹配的值不止一个,则将所有值一栏一起返回。
输出文件如下所示:
19 aaa
1 jhsi
32 aaa bbew jhsi
277
277
将保留为空,因为它不存在。
任何建议都会有所帮助。
答案 0 :(得分:2)
这不容易矢量化。为了提高性能,建议您先进行转换,然后再将数据放入Pandas数据框中。这是使用collections.defaultdict
的解决方案:
# use set for O(1) lookup
scope_set = set(df2['c1'])
# initialise defualtdict of lists
dd = defaultdict(list)
# iterate and create dictionary mapping numbers to keys
for row in df1.itertuples(index=False):
for num in map(int, row.c2.split()):
if num in scope_set:
dd[num].append(row.c1)
# construct dataframe from defaultdict
df = pd.DataFrame({'num': list(dd), 'keys': list(map(' '.join, dd.values()))})
# reindex to include blanks
df = df.set_index('num').reindex(sorted(scope_set)).reset_index()
结果
print(df)
num keys
0 1 jhsi
1 19 aaa
2 32 aaa bbew jhsi
3 277 NaN
设置
from io import StringIO
from collections import defaultdict
file1 = StringIO("""c1\tc2
aaa\t232 65 19 32
bbew\t32 22 20
jhsi\t986 1 32 463 221""")
file2 = StringIO("""c1
19
1
32
277""")
df1 = pd.read_csv(file1, sep='\t')
df2 = pd.read_csv(file2)