Кажется, работает следующее решение.Я предоставлю решение «песочницы», так как оно может стать полезным для других.
Сначала давайте определим такой же фрейм данных панд, как в вопросе:
# generates strings to be used as names, e.g.: 'hlddldxhys'
def randomString(stringLength=10):
letters = string.ascii_lowercase
return ''.join(random.choice(letters) for i in range(stringLength))
# let's generate a set of 600 names
participants = [];
for k in range(600):
participants.append(randomString())
# from the generated set, draw 1000 sellers and buyers
seller = np.random.choice(participants, 1000)
buyer = np.random.choice(participants, 1000)
# construct pandas data frame
df = pd.DataFrame([seller, buyer]).T
df.columns = ['seller', 'buyer']
Рассмотрим итоговый фрейм данных.print(df)
:
seller buyer
----------------------------
0 bpzroghaxp evvhhlbiys
1 qsopxbirgn lwwljadfwg
2 cnllyrzjiz opbvoodpgw
3 hkzafylzst slfqtwdeak
... ... ...
999 natqsscnlk ftvjvgtala
Хотя некоторые намекают на решение (ответы PMende, Tal Avissar и меня), похоже, что оно работает - но только итеративно , гдес каждой итерацией df = df[df.seller.isin(df.buyer.unique()) & df.buyer.isin(df.seller.unique())]
множества df.seller.unique()
и df.buyer.unique()
становятся все более похожими друг на друга.Это повторяется до тех пор, пока они оба не будут одинаковыми (см. Последний оператор if, за которым следует break
):
while(True):
df = df[df.seller.isin(df.buyer.unique()) & df.buyer.isin(df.seller.unique())]
if len(df.seller.unique()) == len(df.buyer.unique()):
if (np.sort(df.seller.unique()) == np.sort(df.buyer.unique())).all() == True:
break
Окончательная проверка подтверждает, что df.seller.unique()
и df.buyer.unique()
имеют одинаковую длину итакже того же состава:
>> len(df.seller.unique()), len(df.buyer.unique())
(281, 281)
>> (np.sort(df.seller.unique()) == np.sort(df.buyer.unique())).all()
True
Ниже на диаграммах показано, как наборы df.seller.unique()
и df.buyer.unique()
становятся похожими друг на друга с каждой итерацией цикла:
См.также графики: визуализация решения