#python #pandas
#python #панды
Вопрос:
У меня есть повторяющиеся записи, которые мне нужно объединить. Все поля одинаковы, за исключением двух полей, вызываемых id1
и id2
— это поля списка, и я хочу объединить их записи. Вот как я бы сделал это только для полей id1
и id2
:
summary_df = df.groupby(['path_md5']).agg(
id1 =('id1', lambda x: str(sorted({id for ids in x.dropna() for id in ids}))),
id2 =('id2', lambda x: str(sorted({id for ids in x.dropna() for id in ids}))),
)
Тем не менее, я не хочу добавлять 60 дополнительных полей, которые говорят first
, чтобы я мог получить их значение. Есть ли лучший способ сделать это? Вот пример ввода / вывода, который я хочу:
id1 id2 path_md5 other_fields (could be 50 fields -- all the same)...
[1,2] [3] abc ...
[7] [9] abc ...
[17] [11] xyz ...
И результат должен быть:
id1 id2 path_md5 other_fields...
[1,2,7] [3,9] abc ...
[17] [11] xyz ...
Каков наилучший способ сделать это?
Я попытался выполнить следующее:
# Dedupe path, combining id1, id2
agg_fields = [col_name for col_name in df.columns if col_name not in ('id1', 'id2')]
raw_df = raw_df.groupby(agg_fields).agg(...).reset_index()
Но это давало мне нулевые результаты (возможно, поскольку многие значения равны нулю?
Ответ №1:
Вы можете создать словарь agg:
agg_dict = {k:'first' for k in df.columns if k not in ['id1','id2','path_md5']}
agg_dict['id1'] = lambda x: str(sorted({id for ids in x.dropna() for id in ids}))
agg_dict['id2'] = lambda x: str(sorted({id for ids in x.dropna() for id in ids}))
summary_df = df.groupby('path_md5', as_index=False).agg(agg_dict)
Комментарии:
1. спасибо, один вопрос: зачем указывать
as_index=False
? Что это делает.2. @samuelbrody1249, который сохраняется
path_md5
как обычный столбец вместо индекса фрейма данных groupby.3. Я вижу. Как это связано с выполнением
reset_index()
послесловий, или они не связаны?4. Тот же эффект, вероятно, Pandas делает то же самое за кулисами.
5.хорошо, круто. Кстати, где я могу узнать больше об этом? Я посмотрел на
groupby page
pandas.pydata.org/pandas-docs/stable/reference/api /… но в нем всего пара загадочных предложений и никаких примеров.