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.loc[:, 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 = {median_column_name: name_subset_df[median_column_name].median()}
87
88
89 for col in name_subset_df.columns:
90
91 if col not in (median_column_name, id_column_name):
92 try:
93
94 name_values_dict[col] = DedupedList(name_subset_df[col].tolist())
95
96
97 except TypeError:
98 name_values_dict[col] = NonNoneList(name_subset_df[col].tolist())
99
100
101 if len(name_values_dict[col]) == 1:
102 name_values_dict[col] = name_values_dict[col][0]
103
104 def IsAllNan(list_name: list) -> bool:
105 """
106 Проверяет, состоит ли список только из значений "nan".
107
108 Args:
109 list_name (list): список, который нужно проверить.
110
111 Returns:
112 bool: True, если все элементы списка равны "nan".
113 """
114
115 return all(str(elem) == "nan" for elem in list_name)
116
117
118
119 if isinstance(name_values_dict[col], list):
120 if len(name_values_dict[col]) == 0 or IsAllNan(name_values_dict[col]):
121 name_values_dict[col] = None
122
123
124 median_and_id_data[name] = name_values_dict
125
126
127
128 new_df = pd.DataFrame.from_dict(median_and_id_data, orient="index").reset_index()
129
130
131 new_df = new_df.rename(columns={"index": id_column_name})
132
133 return new_df