43def MedianDedupedDF(df: pd.DataFrame, id_column_name: str, median_column_name: str) -> pd.DataFrame:
44 """
45 Удаляет дубликаты в колонке идентификаторов элементов DataFrame,
46 заменяя их медианой соответствующих значений в колонке median_column_name.
47 Сохраняет значения из всех остальных столбцов в списки, если они различны, иначе - одиночными элементами.
48
49 Args:
50 df (pd.DataFrame): исходный DataFrame
51 id_column_name (str): имя колонки, в которой находятся идентификаторы
52 median_column_name (str): имя колонки, в которой надо посчитать медианы
53
54 Returns:
55 pd.DataFrame: с удаленными дубликатами и списками в остальных столбцах.
56 """
57
58 median_and_id_data: dict = {}
59
60
61 df[median_column_name] = df[median_column_name].astype(float)
62
63 for name in df[id_column_name].unique():
64 name_subset_df: pd.DataFrame = df.loc[df[id_column_name] == name]
65
66 name_values_dict = {
67 median_column_name: name_subset_df[median_column_name].median()}
68
69
70 for col in name_subset_df.columns:
71
72 if col != median_column_name and col != id_column_name:
73 try:
74 name_values_dict[col] = DedupedList(
75 name_subset_df[col].tolist())
76
77 except TypeError:
78 name_values_dict[col] = NonNoneList(
79 name_subset_df[col].tolist())
80
81
82 if len(name_values_dict[col]) == 1:
83 name_values_dict[col] = name_values_dict[col][0]
84
85 def IsAllNan(l: list):
86 return all(str(elem) == "nan" for elem in l)
87
88
89 if (isinstance(name_values_dict[col], list)):
90 if len(name_values_dict[col]) == 0 or IsAllNan(name_values_dict[col]):
91 name_values_dict[col] = None
92
93
94 median_and_id_data[name] = name_values_dict
95
96
97 new_df = pd.DataFrame.from_dict(
98 median_and_id_data, orient='index').reset_index()
99 new_df.rename(columns={'index': id_column_name}, inplace=True)
100
101 return new_df