54 ) -> pd.DataFrame:
55 """
56 Удаляет дубликаты в колонке идентификаторов элементов DataFrame, заменяя их
57 медианой соответствующих значений в колонке median_column_name.
58
59 Сохраняет значения из всех остальных столбцов в списки,
60 если они различны, иначе - одиночными элементами.
61
62 Args:
63 df (pd.DataFrame): исходный DataFrame.
64 id_column_name (str): имя колонки, содержащей идентификаторы.
65 median_column_name (str): имя колонки, в которой нужно посчитать
66 медианы.
67
68 Returns:
69 pd.DataFrame: DataFrame с удаленными дубликатами и списками в
70 остальных столбцах.
71 """
72
73 median_and_id_data: dict = {}
74
75
76 df[median_column_name] = df[median_column_name].astype(float)
77
78 name_values_dict: dict[str, float | list]
79
80
81 for name in df[id_column_name].unique():
82
83 name_subset_df: pd.DataFrame = df.loc[df[id_column_name] == name]
84
85
86 name_values_dict = {
87 median_column_name: name_subset_df[median_column_name].median()}
88
89
90 for col in name_subset_df.columns:
91
92 if col != median_column_name and col != id_column_name:
93 try:
94
95 name_values_dict[col] = DedupedList(
96 name_subset_df[col].tolist())
97
98
99 except TypeError:
100 name_values_dict[col] = NonNoneList(
101 name_subset_df[col].tolist())
102
103
104 if len(name_values_dict[col]) == 1:
105 name_values_dict[col] = name_values_dict[col][0]
106
107 def IsAllNan(list_name: list) -> bool:
108 """
109 Проверяет, состоит ли список только из значений "nan".
110
111 Args:
112 list_name (list): список, который нужно проверить.
113
114 Returns:
115 bool: True, если все элементы списка равны "nan".
116 """
117
118 return all(str(elem) == "nan" for elem in list_name)
119
120
121
122 if (isinstance(name_values_dict[col], list)):
123
124 if len(name_values_dict[col]) == 0\
125 or IsAllNan(name_values_dict[col]):
126 name_values_dict[col] = None
127
128
129 median_and_id_data[name] = name_values_dict
130
131
132
133 new_df = pd.DataFrame.from_dict(
134 median_and_id_data, orient="index").reset_index()
135
136
137 new_df.rename(columns={"index": id_column_name}, inplace=True)
138
139 return new_df