#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)
]