У меня есть следующий фрейм данных, показывающий взаимосвязь различных объектов в каждой строке.
В столбце «Full_Family» отображается правильная иерархия для всего генеалогического древа от маленького до большого, а не только для объектов в этой конкретной строке. Но следует иметь в виду, что не каждый объект в «Full_Family» появится в «Child/Parent/Ult_Parent», поскольку данные «Full_Family» поступают из другого источника.
Здесь мне нужно решить 2 проблемы:
Ниже приведен пример и идеальный результат:
Хотя A046 является основным родителем в этом семействе, он не отображается в Child/Parent/Ult_Parent этого фрейма данных, поэтому правильным окончательным родителем для каждого семейства в данном случае является A043.
Цените помощь.
IIUC, принимая этот фрейм данных в качестве входных данных:
import pandas as pd
data = {
"Child": ["A032", "A001"],
"Parent": ["A001", "A043"],
"Ult_Parent": ["A039", "A039"],
"Full_Family": [
"A001, A032, A039, A040, A041, A043, A043, A045, A046",
"A001, A032, A039, A040, A041, A043, A043, A045, A046",
],
}
df = pd.DataFrame(data)
Child Parent Ult_Parent Full_Family
0 A032 A001 A039 A001, A032, A039, A040, A041, A043, A043, A045...
1 A001 A043 A039 A001, A032, A039, A040, A041, A043, A043, A045...
Вы можете использовать этот подход:
df["Correct_Order"] = df.apply(
lambda row: ", ".join(sorted([row["Parent"], row["Child"], row["Ult_Parent"]])),
axis=1,
)
df["Correct_Ult_Parent_per_Family"] = (
df[["Parent", "Child", "Ult_Parent"]].max(axis=1).max()
)
Child Parent Ult_Parent Full_Family Correct_Order Correct_Ult_Parent_per_Family
0 A032 A001 A039 A001, A032, A039, A040, A041, A043, A043, A045... A001, A032, A039 A043
1 A001 A043 A039 A001, A032, A039, A040, A041, A043, A043, A045... A001, A039, A043 A043
Если 'Full_Family'
не обязательно находится в порядке возрастания и вы хотите соблюдать его порядок, вы можете определить собственный ключ для sorted
.
Например, если A039
стоит перед A032
в 'Full_Family'
в первой строке:
data = {
"Child": ["A032", "A001"],
"Parent": ["A001", "A043"],
"Ult_Parent": ["A039", "A039"],
"Full_Family": [
"A001, A039, A032, A040, A041, A043, A043, A045, A046",
"A001, A032, A039, A040, A041, A043, A043, A045, A046",
],
}
df = pd.DataFrame(data)
Использование пользовательского ключа:
df["Correct_Order"] = df.apply(
lambda row: ", ".join(
sorted(
[row["Parent"], row["Child"], row["Ult_Parent"]],
key=lambda x: {
val: idx for idx, val in enumerate(row["Full_Family"].split(", "))
}[x],
)
),
axis=1,
)
df["Correct_Ult_Parent_per_Family"] = df["Correct_Order"].str.split().str[-1].max()
Child Parent Ult_Parent Full_Family Correct_Order Correct_Ult_Parent_per_Family
0 A032 A001 A039 A001, A039, A032, A040, A041, A043, A043, A045... A001, A039, A032 A043
1 A001 A043 A039 A001, A032, A039, A040, A041, A043, A043, A045... A001, A039, A043 A043
@LH IIUC, вторая часть моего ответа посвящена этому, используя специальный ключ для sorted
.
Только что проверил! Извините, я не знаю, почему я не видел остальные части. Это работает так, как я ожидаю. Спасибо :)
@LH Не беспокойтесь, я отредактировал ответ, чтобы добавить его, так что, возможно, поэтому вы его пропустили. Кроме того, поскольку 'Full_Family'
не обязательно является возрастающим, я просто понял, что нам нужен другой способ получения 'Correct_Ult_Parent_per_Family'
во второй части, поэтому я сейчас редактирую его, чтобы добавить.
Итак, у меня есть строка, содержащая такой идентификатор, как «008ZY8-E», и я запускаю эту функцию и продолжаю получать эту ошибку KeyError: «008ZY8-E», вы знаете причину, почему?
@LH Трудно сказать без дополнительной информации, но, вероятно, ее нет в значении 'Full_Family'
.
Я думаю, это немного отличается от того, что я хочу. Я считаю, что мой пример неудачен. Порядок не является неправильным, потому что позиция Родителя/Дочернего элемента неверна. Это может быть случайно неправильно. Например, Child должен быть Ult_Parent, а Ult_Parent должен быть Child. Дело в том, что нам нужно проверить порядок в Full_Family, чтобы мы могли определить правильный порядок. Итак, я предполагаю, что использование сортировки и исправления порядка Parent > Child > Ult_Parent - это не то, что мне нужно в этом случае. Спасибо за помощь!