Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 25

Два массива, перебор значений по условию в цикле

05.03.2021, 09:27. Показов 3421. Ответов 4

Студворк — интернет-сервис помощи студентам
Доброго времени суток друзья! с vba на Python перейти оказалось немного сложнее чем думал (много нюансов), но надежда пока остаётся)) Есть два массива (массив1 - 50000 строк, массив2 - 6000 строк) Необходимо перебрать значения из первого массива сравнить два столбца с массивом2 и при совбадении значений по столбцам в массиве два записать данные из подходящих по условию строк нужного столбца. В vba это примерно бы выглядело так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim df1 As Variant
Dim df2 As Variant
df1 = ThisWorkbook.Sheets(1).Range(SM.Sheets(1).Cells(1, 1), SM.Sheets(1).Cells(R, 50))
df2 = ThisWorkbook.Sheets(2).Range(SM.Sheets(1).Cells(1, 1), SM.Sheets(1).Cells(R, 50))
 
For STR_i = 2 To 50000
    For STR_i2 = 2 To 6000
        If df1(STR_i, 3) = df2(STR_i2, 6) And FormatDateTime(df1(STR_i, 12), 2) = FormatDateTime(df2(STR_i2, 18), 2)  _
        And Format(df1(STR_i, 12), "h:m") = Format(df2(STR_i2, 18), "h:m") Then 
               df1(STR_i, 8) = df2(STR_i2, 36)
               Exit for
        End If
    Next STR_i2
Next STR_i
В Python сначала была идея с объединением массивов через merge, но не смог найти подходящих примеров для сравнения по двум столбцам при объединении. В итоге решил сделать аналог vba кода. Вот что получилось:
Python
1
2
3
4
5
6
7
8
9
import pandas as pd
df1 = pd.read_excel(«df1.xlsx")
df2 = pd.read_excel(«df2.xlsx")
  
for STR_i in range(2, 50000):
    for STR_i2 in range(2, 6000):
        if df1.loc[STR_i,id'] == df2.loc[STR_i2, 'M_ID']:
            if df1.loc[STR_i, 'Исполнена'] == df2.loc[STR_i2, 'ЗАКРЫТ_ВРЕМЯ']:    
                    df1.loc[STR_i, 8] = df2.loc[STR_i2, 36]
Подскажите пожалуйста, что сделал неправильно и насколько вообще правильно понял логику построения таких задач.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2021, 09:27
Ответы с готовыми решениями:

Перебор действительных значений в цикле
Ребят, вот только начал изучать с++ и сразу же возник вопрос. Есть X-начальное и X-конечное, как создать цикл или же перебрать все...

Перебор значений лотереи в цикле
Перебор значений лотереи и когда выпадает 7 на экране отображается окно: "ваш номер 7, Вы выиграли!" нужно сделать задачу с...

Перебор массива в цикле
Доброго времени суток, можете подсказать? Есть функция с массивом, при работе цикла, он у меня скипает элемент массива '1', и сразу...

4
Эксперт Python
8849 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
05.03.2021, 09:50
fandreychu, использовать for в pandas можно только при очень крайней необходимости...
Сформулируй конкретнее саму задачу. Лучше, если сами файлы скинешь с объяснениями что куда.
Pandas может делать выборку сразу без циклов из всего массива по шаблону:
df1[(...условие1...) & (...условие2...))]['столбец в массиве, в который идет результат'] = df2[(...те же условия...)]['любой столбец'] + (любая операция) df3...
1
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 25
05.03.2021, 10:32  [ТС]
Gdez, про for сам сомневался… но не знал как по другому можно это решить. Прикрепил пример.xlsx.

Задача:
В таблице 1 на "лист1" есть незаполненная колонка «Время» (подкрасил жёлтым)
Её нужно заполнить значениями из колонки «Время» Таблицы 2 на «лист2» (подкрасил зелёным) при условии совпадения значений в столбцах «id» и «закрыт». Если совпадений по строке нет, то строка остаётся пустой.
Вложения
Тип файла: xlsx пример.xlsx (7.1 Кб, 12 просмотров)
0
Эксперт Python
8849 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
05.03.2021, 15:02
fandreychu,
Python
1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
writer = pd.ExcelWriter('пример.xlsx', engine='xlsxwriter')
df1 = pd.read_excel('пример.xlsx', sheet_name='Лист 1')
df2 = pd.read_excel('пример.xlsx', sheet_name='Лист 2')
df1 = df1.reindex(df1.index.union(df2.index))
df2 = df2.reindex(df2.index.union(df1.index))
rows = df1[((df1["Tаблица 1"] == df2["Tаблица 2"]) & (df1["Unnamed: 2"] == df2["Unnamed: 2"]))].index
df1.iloc[rows, 1] = df2.iloc[rows, 1]
frames = {'Лист 1': df1, 'Лист 2': df2}
for sheet, frame in frames.items():
    frame.to_excel(writer, sheet_name=sheet, startrow=1, index = False, header = True)
writer.save()
0
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 25
11.03.2021, 08:10  [ТС]
Gdez, спасибо что не бросил в беде) Начал изучать все варианты по решению более всего понравилось вариант с merge. Оставил ниже, вдруг кому пригодится.
Python
1
df1.merge(df2, on=[id, ‘Закрыт'], how=‘left')
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2021, 08:10
Помогаю со студенческими работами здесь

Перебор экземпляров массива в цикле
Какой вариант быстрее? Есть ли вообще разница и насколько большая? Зависит ли от типа объекта в массиве? MyClass massiv = new MyClass;...

Перебор элементов массива в цикле for
есть 3 массива с равным кол-вом элементов, необходимо, чтобы они одновременно изменялись и внутри вложенных циклов с ними происходили...

Перебор элементов массива в цикле
Знаю,вопрос тупой, но что делать,не знаю.:wall: (Код на java в Android studio)У меня есть приложение, в котором после определенных...

Вывести количество значений, удовлетворяющих условию в цикле
как вывести не значения, а количество значений ? Program lab4; Var d1, m1,y1,d2,m2,y2,z,b,n,c: integer; Begin writeln ('Vvedyte...

Перебор ассоциативного массива по условию
Добрый день, подскажите пожалуйста как осуществить переборку массива по такому условию. Мне в форму приходят сроки такого типа: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru