Если значения совпадают, отсортируйте строки

Если значения строк A+B+C совпадают со значениями строк D+E+F, приведите строки D+E+F к той же строке A+B+C.

дф это:

df = pd.DataFrame({"A":['02.04.2024','03.04.2024', '04.04.2024', '05.04.2024', '06.04.2024',],
                   "B":['01:00:00', '02:00:00', '03:00:00', '04:00:00', '05:00:00'],
                   "C":['1111', '1111', '1111', '1111', '1111'],
                   "D":['03.04.2024', '', '06.04.2024', '02.04.2024', ''],
                   "E":['02:00:00', '', '05:00:00', '01:00:00',''],
                   "F":['1111','', '1111', '1111','']})
print(df)
            A         B     C           D         E     F
0  02.04.2024  01:00:00  1111  03.04.2024  02:00:00  1111
1  03.04.2024  02:00:00  1111                            
2  04.04.2024  03:00:00  1111  06.04.2024  05:00:00  1111
3  05.04.2024  04:00:00  1111  02.04.2024  01:00:00  1111
4  06.04.2024  05:00:00  1111


df expected :

            A         B     C           D         E     F
0  02.04.2024  01:00:00  1111  02.04.2024  01:00:00  1111
1  03.04.2024  02:00:00  1111  03.04.2024  02:00:00  1111
2  04.04.2024  03:00:00  1111                            
3  05.04.2024  04:00:00  1111                            
4  06.04.2024  05:00:00  1111  06.04.2024  05:00:00  1111

Все мои попытки, например. маска, замена или сортировка не увенчались успехом.

Можете ли вы иметь несколько точных совпадений? другие столбцы?

mozway 08.08.2024 11:43

Да, в других столбцах может быть несколько точных совпадений.

mxplk 08.08.2024 12:35

Тогда, возможно, проясните свой пример, чтобы проиллюстрировать это, я обновлю свой ответ.

mozway 08.08.2024 12:38

Во-первых: ваше решение было бы здорово, но у меня оно не работает. Возможно, с моей стороны возникла проблема с форматированием (str) или (int) или (date))?

mxplk 08.08.2024 12:48

Я еще не обновил свой ответ (я ждал, пока вы обновите пример). Если вы хотите предоставить воспроизводимый пример, используйте df.to_dict('tight') и вставьте выходной словарь в качестве редактирования в свой вопрос. Если у вас есть ошибка, пожалуйста, укажите ее явно.

mozway 08.08.2024 13:11

Я нашел ошибку, решение работает отлично. Благодарю вас за ваше усилие.

mxplk 08.08.2024 13:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Этого можно добиться, перебирая каждую строку и сопоставляя значения из столбцов A, B и C с D, E и F.

import pandas as pd

# Initial DataFrame
df = pd.DataFrame({"A":['02.04.2024','03.04.2024', '04.04.2024', '05.04.2024', '06.04.2024',],
                   "B":['01:00:00', '02:00:00', '03:00:00', '04:00:00', '05:00:00'],
                   "C":['1111', '1111', '1111', '1111', '1111'],
                   "D":['03.04.2024', '', '06.04.2024', '02.04.2024', ''],
                   "E":['02:00:00', '', '05:00:00', '01:00:00',''],
                   "F":['1111','', '1111', '1111','']})

# Iterate through the DataFrame
for i in range(len(df)):
    for j in range(len(df)):
        # Check if A+B+C matches D+E+F
        if (df.loc[i, 'A'] == df.loc[j, 'D'] and
            df.loc[i, 'B'] == df.loc[j, 'E'] and
            df.loc[i, 'C'] == df.loc[j, 'F']):
            # If match is found, bring D+E+F to the corresponding row of A+B+C
            df.loc[i, 'D'] = df.loc[j, 'D']
            df.loc[i, 'E'] = df.loc[j, 'E']
            df.loc[i, 'F'] = df.loc[j, 'F']
            # Clear the original row
            df.loc[j, ['D', 'E', 'F']] = ''

# Print the updated DataFrame
print(df)

Я получаю только первую совпадающую строку (индекс 0) в «D», «E», «F». Остальные остаются пустыми.

mxplk 08.08.2024 13:10
Ответ принят как подходящий

Похоже, вы могли бы использовать слияние после разделения DataFrame на две части и замены пустых строк на NA:

df.replace('', pd.NA, inplace=True)

left = ['A', 'B', 'C']
right = ['D', 'E', 'F']
out = (df[left]
       .merge(df[right], left_on=left, right_on=right, how='outer')
       .dropna(how='all')
      )

out.fillna('', inplace=True)

Выход:

            A         B     C           D         E     F
0  02.04.2024  01:00:00  1111  02.04.2024  01:00:00  1111
1  03.04.2024  02:00:00  1111  03.04.2024  02:00:00  1111
2  04.04.2024  03:00:00  1111                            
3  05.04.2024  04:00:00  1111                            
4  06.04.2024  05:00:00  1111  06.04.2024  05:00:00  1111

Другие вопросы по теме