Если значения строк 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
Все мои попытки, например. маска, замена или сортировка не увенчались успехом.
Да, в других столбцах может быть несколько точных совпадений.
Тогда, возможно, проясните свой пример, чтобы проиллюстрировать это, я обновлю свой ответ.
Во-первых: ваше решение было бы здорово, но у меня оно не работает. Возможно, с моей стороны возникла проблема с форматированием (str) или (int) или (date))?
Я еще не обновил свой ответ (я ждал, пока вы обновите пример). Если вы хотите предоставить воспроизводимый пример, используйте df.to_dict('tight') и вставьте выходной словарь в качестве редактирования в свой вопрос. Если у вас есть ошибка, пожалуйста, укажите ее явно.
Я нашел ошибку, решение работает отлично. Благодарю вас за ваше усилие.






Этого можно добиться, перебирая каждую строку и сопоставляя значения из столбцов 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». Остальные остаются пустыми.
Похоже, вы могли бы использовать слияние после разделения 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
Можете ли вы иметь несколько точных совпадений? другие столбцы?