Создать столбец Pandas, отображающий максимальное количество повторяющихся пар из двух других столбцов

#python #pandas

#python #pandas

Вопрос:

У меня есть два столбца со списками одинаковой длины, но длина обоих списков может отличаться для каждой строки. Я хочу создать столбец 3, который является числом, соответствующим максимальному количеству дубликатов, созданных путем объединения чисел по индексу между столбцами 1 и 2. Например:

 df=

col 1                       col 2               col 3
["c","c"]                   ["d", "d"]          2 // ("c","d") is repeated twice
["a","b","c","a"]           ["f","e","e","f"]   2 //("a","f") is repeated twice while ("b","e") and ("c","e") are only repeated once
["a","b","g"]               ["f","e","f"]       1 //("a","f"), ("b","e"), and ("g","f") are repeated once
  

Что я пробовал до сих пор:

До сих пор мой подход заключался в том, чтобы сначала создать новый столбец со списком кортежей. Взяв первую строку в моем примере, я хотел создать [(«c», «d»), («c», «d»)] и повторить это для каждого столбца. Затем я планировал применить Counter(df["col 3"]).most_common(1)[0][1] , чтобы получить максимальное количество дублированных пар.

Чтобы создать столбец со списками кортежей, я пытался: df["col 3"] = list(zip(df["col 1"],df["col 2"])) но, похоже, это возвращает ([«c», «c»],[«d»,»d»]), используя первую строку в качестве примера вместо [(«c», «d»),(«c»,»d»)]

Любая помощь была бы высоко оценена!

Ответ №1:

Попробуйте apply с Counter :

 df['col 3'] = df.apply(lambda x: np.max(Counter(zip(x['a'], x['b'])).values()), axis=1)
  

Ответ №2:

Вы также можете попробовать использовать понимание списка и numpy :

 df['col3'] = [np.max(np.unique(tuple(zip(*entry)), 
                     axis=0, 
                     return_counts=True)[-1])
             for entry in zip(df.col1, df.col2)
              ]