Я работаю над адатомами с большими пандами, около 100 миллионов строк и 2 столбца. Я хочу перебрать данные и эффективно установить третий столбец в зависимости от значений col1 и col2. Это то, чем я сейчас занимаюсь -
df[col3] = 0
for idx, row in df.iterrows():
val1 = row[col1]
val2 = row[col2]
df1 = df.loc[(df.col1 == val2) & (df.col2 == val1)]
if len(df1) > 0:
df.loc[(df.col1 == val2) & (df.col2 == val1), col3] = 1
Example:
df = pd.DataFrame({'col1':[0,1,2,3,4,11], 'col2':[10,11,12,4,3,0]})
>> df.head()
col1 col2
0 0 10
1 1 11
2 2 12
3 3 4
4 4 3
5 3 10
I want to add 'col3' such that last 2 rows of the third column are
1. Think of it as a reverse_edge column which is 1 when for each
(val1, val2) in col1, col2 there is a (val2, val1) in col1, col2
col1 col2 col3
0 0 10 0
1 1 11 0
2 2 12 0
3 3 4 1
4 4 3 1
5 11 0 0
Какой самый эффективный способ сделать это вычисление? В настоящее время у меня уходит несколько часов, чтобы пройти весь фрейм данных.
РЕДАКТИРОВАТЬ: Думайте о каждом значении в col1 и соответствующем значении в col2 как ребро на графике (val1 -> val2). Я хочу знать, существует ли обратный край или нет (val2 -> val1).