Соответствие нескольким столбцам и добавление в фрейм данных - PullRequest
1 голос
/ 03 февраля 2020

предполагаемый набор данных,

df1

num1 num2
27    1
973   3
1410  3
724   1
346   5

df2

 a1     a2   c1      c2
27.0    1   red    apple
131.0   1   blue   banana
2124.0  3   green  apple
1345.0  1   red    orange
346.0   5   blue   grape

Я хочу сравнить num1 - a1 & num2 - a2, если оба условия одинаковы, я хочу добавить значения в c1 и c2 в список (предположим, что начало - пустой список)

условие

  1. Как видите, форма num1-a1, num2 & a2 отличается.

  2. В список добавляются только значения 'c1' и 'c2'

    (num1, num2, a1, a2 просто используются для сравнения и сопоставления)

  3. Заказ перемешан, и кадры данных имеют разные размеры. (различная длина столбца)

Вывод того, что я хочу

приведенный выше пример, 2 совпадения, (27-1, 346-5), итак

mylist = [red, apple, blue, grape]

Как я могу это сделать?

Спасибо за чтение.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Используйте Series.str.zfill с DataFrame.assign для добавления 0 для сопоставления с df2, затем DataFrame.merge с объединением по умолчанию, последнее используйте DataFrame.stack для Series и конвертируйте в список:

mylist = (df1.assign(num1 = df1['num1'].astype(str).str.zfill(4),
                     num2 = df1['num2'].astype(str).str.zfill(3))
              .merge(df2, left_on=['num1','num2'], right_on=['a1','a2'])[['c1','c2']]
              .stack()
              .tolist())
print (mylist)
['green', 'apple', 'orange', 'melon',
 'blue', 'banana', 'purple', 'peach']
0 голосов
/ 04 февраля 2020

@ jezrael Я сделал это, сославшись на ваш код, и он работает. Могу ли я так поступить?

mylist = (df1.merge(df2, left_on=['num1','num2'], right_on=['a1','a2'])[['c1','c2']]
          .stack()
          .tolist())
...