匹配列中的值并以pandas返回另一列|蟒蛇

时间:2018-10-08 15:20:42

标签: python string pandas dataframe

我有两列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将保留为空,因为它不存在。

任何建议都会有所帮助。

1 个答案:

答案 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)
相关问题