Создать новый столбец из сопоставленного элемента между различными столбцами, содержащими массивы - PullRequest
1 голос
/ 07 ноября 2019

У меня есть фрейм данных, в котором строки столбца col2 содержат списки чисел

    col1   col2

1 . 123    123, 562, 7779
2 . 456    456, 111, 123
3 . 789    667, 1213, 456
4 . 1011   1213, 445, 909, 123
5 . 1213   1011, 444, 909, 789

Я хотел бы найти совпадения между col1 и col2 и создать новый столбец 'new', добавляя группыв col2, содержащем совпадения с col1

Результат

    col1   col2                   new

1   123    123, 562, 7779         123, 562, 7779
2   456    125, 1011, 123         456, 444, 909, 789
3   789    667, 1213, 456         456, 444, 909, 789
4   1011   1213, 445, 909, 123    125, 1011, 123
5   1213   456, 444, 909, 789     667, 1213, 456

Это мой код, но он вылетает. Я думаю, я не могу прочитать списки, содержащиеся в строках col2 [rows *

new = []
for val in col1:
    for i in col2:
        if val in i:
           new.append(i)
        else:
           continue

print (new)

1 Ответ

1 голос
/ 07 ноября 2019

Идея ltest, если соответствует col1 значение в col2 и для общего решения возвращает значение по умолчанию, здесь no match, если значение не существует:

f = lambda x: next(iter([y for y in df['col2'].tolist() if str(x) in y]), 'no match')
df['new'] = df['col1'].apply(f)
print (df)
   col1                 col2                  new
1   123       123, 562, 7779       123, 562, 7779
2   456        456, 111, 123        456, 111, 123
3   789       667, 1213, 456  1011, 444, 909, 789
4  1011  1213, 445, 909, 123  1011, 444, 909, 789
5  1213  1011, 444, 909, 789       667, 1213, 456

Также работает для списка значений:

df['new'] = df['col1'].apply(f)
print (df)
   col1                   col2                    new
1   123       [123, 562, 7779]       [123, 562, 7779]
2   456        [456, 111, 123]        [456, 111, 123]
3   789       [667, 1213, 456]  [1011, 444, 909, 789]
4  1011  [1213, 445, 909, 123]  [1011, 444, 909, 789]
5  1213  [1011, 444, 909, 789]       [667, 1213, 456]
...