0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 25

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

05.03.2021, 09:27. Показов 3443. Ответов 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
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
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
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
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 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru