Сопоставьте значение в столбце и верните другой столбец в pandas |питон - PullRequest
0 голосов
/ 08 октября 2018

У меня есть 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 голосов
/ 08 октября 2018

Это не легко векторизовать.Для повышения производительности я предлагаю вам выполнить преобразование, прежде чем помещать данные в фрейм данных 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...