Есть ли более эффективный способ получить все строки, которые каким-либо образом связаны с любой другой строкой в том же самом df (равенство, используемое в этом примере, фактическая функция немного сложнее):
import pandas as pd
from pydataset import data
df = data('iris')
df = df[df.index<10]
#adding ID col for ease of ref
df['ID'] = df.index
df
Sepal.Length Sepal.Width Petal.Length Petal.Width Species ID
1 5.1 3.5 1.4 0.2 setosa 1
2 4.9 3.0 1.4 0.2 setosa 2
3 4.7 3.2 1.3 0.2 setosa 3
4 4.6 3.1 1.5 0.2 setosa 4
5 5.0 3.6 1.4 0.2 setosa 5
6 5.4 3.9 1.7 0.4 setosa 6
7 4.6 3.4 1.4 0.3 setosa 7
Все, что я могу придумать, это df.copy()
и затем цикл:
df_copy = df.copy()
df_want = pd.DataFrame(columns=['ID','Sepal.Length','Sepal.Width','ExID', 'ExSepal.Length', 'ExSepal.Width'])
for row in range(0, df.shape[0]):
for row2 in range(0, df_copy.shape[0]):
if (df.iloc[row]['ID'] != df_copy.iloc[row2]['ID'] and
df.iloc[row]['Sepal.Length'] == df_copy.iloc[row2]['Sepal.Length']):
df_want = df_want.append({'ID':df.iloc[row]['ID'],
'Sepal.Length':df.iloc[row]['Sepal.Length'],
'Sepal.Width':df.iloc[row]['Sepal.Width'],
'ExID':df_copy.iloc[row2]['ID'],
'ExSepal.Length':df_copy.iloc[row2]['Sepal.Length'],
'ExSepal.Width':df_copy.iloc[row2]['Sepal.Width']},
ignore_index=True)
df_want
ID Sepal.Length Sepal.Width ExID ExSepal.Length ExSepal.Width
4.0 4.6 3.1 7.0 4.6 3.4
5.0 5.0 3.6 8.0 5.0 3.4
7.0 4.6 3.4 4.0 4.6 3.1
8.0 5.0 3.4 5.0 5.0 3.6
Так что row_ID
4 - это то же самое, что 7, а 5 - это то же самое, что и 8и т. д.
Попытка поиска немного, самым близким, что я нашел, было это Выбор строк из DataFrame на основе значений в столбце в пандах , но изо всех сил пытаться использовать isin()
вэто дело.