Python Pandas Excel нужна помощь

Alexxxandr

Новичок
Пользователь
Сен 11, 2022
36
0
6
Здравствуйте! Нужно сравнить 2 таблицы Excel. В каждой из них есть колонка с фамилиями и соответствующие им объемы топлива. Нужно сравнить их, и там, где отдельно взятой фамилии в разных таблицах соответствует разное кол-во объема топлива подкрасить ячейку с объемом в красный цвет. Фамилии могут быть не по порядку и кол-во фамилий в 2-х таблицах может быть разным. Если в одной таблице количество фамилий больше либо равно, чем в другой, то "красить" ячейки с "Количеством" в бОльшей таблице. При этом нужно подкрасить ячейки с фамилиями, которых нет в меньшей таблице.
Как я понимаю, то код должен начинаться так:
import pandas as pd

df1 = pd.read_excel("Сверка топлива пробы.xlsx", "Ведомость заправочная", index_col=0)
df2 = pd.read_excel("Сверка топлива пробы.xlsx", "Ведомость организации", index_col=0)
len(df1)
len(df2)
while len(df1)>=len(df2)
Только начинаю разбираться. Получилось написать короткий код через Pandas, но для этого мне пришлось преобразовывать сами таблицы, удаляя все колонки в каждой из таблиц, кроме 2-х : на листе "Ведомость заправочная" - "VIN" и "Количество", на листе "Ведомость организации" - "Водитель " и "Количество". Собственно сам код:
import pandas as pd

df1 = pd.read_excel("Сверка топлива пробы.xlsx", "Ведомость заправочная", index_col=0)
df2 = pd.read_excel("Сверка топлива пробы.xlsx", "Ведомость организации", index_col=0)

diff = df1 - df2
print(diff)
diff.to_excel("Samp.xlsx", sheet_name="Sheet3")

Надеюсь на Вашу помощь!
 

Вложения

  • Сверка топлива пробы.zip
    16 КБ · Просмотры: 6
Последнее редактирование:

Alexxxandr

Новичок
Пользователь
Сен 11, 2022
36
0
6
Спасибо! Вы, как всегда, на высоте! Почти додумал )) Но буду снова разбираться, что такое переменная res. Многие говорят, что синтаксис вторичен в написании кода, главное - алгоритм, но я по себе вижу, что это далеко не так.

Получилось в коде, что все результаты деления (на 8, на 10, на 12) суммируются между собой для каждой отдельной даты, а не отдельно для 8, 10 и 12. Я так понимаю, что нужно сделать 3 переменных res? (res1,res2, res3)

Python:
import pandas as pd

dct = {}
dct1 = {}  # Словарь для 8
dct2 = {}  # Словарь для 10
dct3 = {}  # Словарь для 12
file = "К-во конт-кубов.xlsx"
df = pd.read_excel(file, sheet_name=["Лист1", "Лист2"])
date = df["Лист2"]["Дата"]
capacity = df["Лист2"]["Объем"]

# Делаем словарь, ключ - дата, значение - сумма (индексы элементов в capacity)
for i in date:
    dct[i] = [index for index, value in enumerate(date) if value == i]

# # Делаем дела с делением и добавляем результаты в словарь
res1 = 0
res2 = 0
res3 = 0
for i in dct:
    for j in dct[i]:
        if capacity[j] % 8 == 0:
            res1 += capacity[j] / 8
        elif capacity[j] % 10 == 0:
            res2 += capacity[j] / 10
        elif capacity[j] % 12 == 0:
            res3 += capacity[j] / 12
        else:
            continue
    dct1[i] = res1
    res1 = 0
    dct2[i] = res2
    res2 = 0
    dct3[i] = res3
    res3 = 0

print("Сумма результатов деления на 8 по дням:", dct1)
print("Сумма результатов деления на 10 по дням:", dct2)
print("Сумма результатов деления на 12 по дням:", dct3)
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Спасибо! Вы, как всегда, на высоте! Почти додумал )) Но буду снова разбираться, что такое переменная res. Многие говорят, что синтаксис вторичен в написании кода, главное - алгоритм, но я по себе вижу, что это далеко не так.

Получилось в коде, что все результаты деления (на 8, на 10, на 12) суммируются между собой для каждой отдельной даты, а не отдельно для 8, 10 и 12. Я так понимаю, что нужно сделать 3 переменных res? (res1,res2, res3)

Python:
import pandas as pd

dct = {}
dct1 = {}
dct2 = {}
dct3 = {}
file = "К-во конт-кубов.xlsx"
df = pd.read_excel(file, sheet_name=["Лист1", "Лист2"])
date = df["Лист2"]["Дата"]
capacity = df["Лист2"]["Объем"]

# Делаем словарь, ключ - дата, значение - сумма (индексы элементов в capacity)
for i in date:
    dct[i] = [index for index, value in enumerate(date) if value == i]

# # Делаем дела с делением и добавляем результаты в словарь
res1 = 0
res2 = 0
res3 = 0
for i in dct:
    for j in dct[i]:
        if capacity[j] % 8 == 0:
            res1 += capacity[j] / 8
        elif capacity[j] % 10 == 0:
            res2 += capacity[j] / 10
        elif capacity[j] % 12 == 0:
            res3 += capacity[j] / 12
        else:
            continue
    dct1[i] = res1
    res1 = 0
    dct2[i] = res2
    res2 = 0
    dct3[i] = res3
    res3 = 0

print(dct1)
print(dct2)
print(dct3)
да, можно еще сделать список на каждый день, так побыстрее
Python:
import pandas as pd

dct = {}
# dct1 = {}
# dct2 = {}
# dct3 = {}
file = "К-во конт-кубов.xlsx"
df = pd.read_excel(file, sheet_name=["Лист1", "Лист2"])
date = df["Лист2"]["Дата"]
capacity = df["Лист2"]["Объем"]

# Делаем словарь, ключ - дата, значение - сумма (индексы элементов в capacity)
for i in date:
    dct[i] = [index for index, value in enumerate(date) if value == i]

# # Делаем дела с делением и добавляем результаты в словарь
res1 = 0
res2 = 0
res3 = 0
dct_result = {}
for i in dct:
    for j in dct[i]:
        if capacity[j] % 8 == 0:
            res1 += capacity[j] / 8
        elif capacity[j] % 10 == 0:
            res2 += capacity[j] / 10
        elif capacity[j] % 12 == 0:
            res3 += capacity[j] / 12
        else:
            continue
    dct_result[i] = [res1, res2, res3]
    # dct1[i] = res1
    res1 = 0
    # dct2[i] = res2
    res2 = 0
    # dct3[i] = res3
    res3 = 0

print(dct_result)
# print(dct1)
# print(dct2)
# print(dct3)
 
  • Мне нравится
Реакции: Alexxxandr

Alexxxandr

Новичок
Пользователь
Сен 11, 2022
36
0
6
Большое Вам спасибо, что помогаете! Сам бы не осилил. С помощью Ваших решений и примеров понемногу приходит понимание.
А как этот результат добавить в изначальный файл "К-во конт-кубов.xlsx" в лист1? Просто у меня получается заминка, как из словаря перевести в датафрейм, а потом на лист эксель.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Большое Вам спасибо, что помогаете! Сам бы не осилил. С помощью Ваших решений и примеров понемногу приходит понимание.
А как этот результат добавить в изначальный файл "К-во конт-кубов.xlsx" в лист1? Просто у меня получается заминка, как из словаря перевести в датафрейм, а потом на лист эксель.
второй лист пропадает, его нужно сохранять и писать вместе с первым, пример
Python:
import pandas as pd

dct = {}
# dct1 = {}
# dct2 = {}
# dct3 = {}
file = "К-во конт-кубов.xlsx"
df = pd.read_excel(file, sheet_name=["Лист1", "Лист2"])
date = df["Лист2"]["Дата"]
capacity = df["Лист2"]["Объем"]

# Делаем словарь, ключ - дата, значение - сумма (индексы элементов в capacity)
for i in date:
    dct[i] = [index for index, value in enumerate(date) if value == i]

# # Делаем дела с делением и добавляем результаты в словарь
res1 = 0
res2 = 0
res3 = 0
dct_result = {}
for i in dct:
    for j in dct[i]:
        if capacity[j] % 8 == 0:
            res1 += capacity[j] / 8
        elif capacity[j] % 10 == 0:
            res2 += capacity[j] / 10
        elif capacity[j] % 12 == 0:
            res3 += capacity[j] / 12
        else:
            continue
    dct_result[i] = [res1, res2, res3]
    # dct1[i] = res1
    res1 = 0
    # dct2[i] = res2
    res2 = 0
    # dct3[i] = res3
    res3 = 0

# print(dct_result)
# print(dct1)
# print(dct2)
# print(dct3)

# Делаем датафрейм и пишем в ексель
df_result = pd.DataFrame.from_dict(dct_result, orient="index", columns=["8м", "10м", "12м"])
# print(df_result)

with pd.ExcelWriter(file) as writer:
    df_result.to_excel(writer, sheet_name="Лист1")
 
  • Мне нравится
Реакции: Alexxxandr

Alexxxandr

Новичок
Пользователь
Сен 11, 2022
36
0
6
Спасибо!)) Добавил исключения в код, это числа, которые не делятся без остатка на 8, 10, 12.
Python:
import pandas as pd

dct = {}
# dct1 = {}  # Словарь для 8
# dct2 = {}  # Словарь для 10
# dct3 = {}  # Словарь для 12
file = "К-во конт-кубов.xlsx"
df = pd.read_excel(file, sheet_name=["Лист1", "Лист2"])
date = df["Лист2"]["Дата"]
capacity = df["Лист2"]["Объем"]

# Делаем словарь, ключ - дата, значение - сумма (индексы элементов в capacity)
for i in date:
    dct[i] = [index for index, value in enumerate(date) if value == i]

# # Делаем дела с делением и добавляем результаты в словарь
res1 = 0
res2 = 0
res3 = 0
dct_result = {}
for i in dct:
    for j in dct[i]:
        if capacity[j] % 8 == 0:
            res1 += capacity[j] / 8
        elif capacity[j] % 10 == 0:
            res2 += capacity[j] / 10
        elif capacity[j] % 12 == 0:
            res3 += capacity[j] / 12
        else:
            if capacity[j] == 26:
                res2 += 1
                res1 += 2
            if capacity[j] == 28:
                res2 += 2
                res1 += 1
            if capacity[j] == 42:
                res2 += 1
                res1 += 4
            if capacity[j] == 46:
                res2 += 3
                res1 += 2
            if capacity[j] == 54:
                res2 += 3
                res1 += 3
    dct_result[i] = [res1, res2, res3]

    # dct1[i] = res1
    res1 = 0
    # dct2[i] = res2
    res2 = 0
    # dct3[i] = res3
    res3 = 0

# print("Сумма результатов деления на 8 по дням:", dct1)
# print("Сумма результатов деления на 10 по дням:", dct2)
# print("Сумма результатов деления на 12 по дням:", dct3)
print(dct_result)

# Делаем датафрейм и пишем в ексель
df_result = pd.DataFrame.from_dict(dct_result, orient="index", columns=["8м", "10м", "12м"])
# print(df_result)

with pd.ExcelWriter(file) as writer:
    df_result.to_excel(writer, sheet_name="Лист1")
Не соображу, почему когда принтуется print(dct_result), то в результатах появляется nan: [0, 0, 0], ничего же не было пропущено?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
это строка с итогом из листа 2
ее можно пропускать
 
  • Мне нравится
Реакции: Alexxxandr

Alexxxandr

Новичок
Пользователь
Сен 11, 2022
36
0
6
это строка с итогом из листа 2
ее можно пропускать
Добрый день! Т.е. при формировании словаря dct прописать условие ?

Python:
for i in date:
    if "nan" in str(i):
        continue
    else:
        dct[i] = [index for index, value in enumerate(date) if value == i]
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Добрый день! Т.е. при формировании словаря dct прописать условие ?

Python:
for i in date:
    if "nan" in str(i):
        continue
    else:
        dct[i] = [index for index, value in enumerate(date) if value == i]
ну да попробуйте
 
  • Мне нравится
Реакции: Alexxxandr

Форум IT Специалистов