групповое сохранение всех предыдущих полей

#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 /… но в нем всего пара загадочных предложений и никаких примеров.