Python Pandas - объединение в основном дублированных строк

Некоторые из моих данных выглядят следующим образом:

date, name, value1, value2, value3, value4
1/1/2001,ABC,1,1,,
1/1/2001,ABC,,,2,
1/1/2001,ABC,,,,35

Я пытаюсь добраться до точки, где я могу запустить

data.set_index(['date', 'name'])

Но с данными as-is есть, конечно, дубликаты (как показано выше), поэтому я не могу этого сделать (и мне не нужен индекс с дубликатами, и я не могу просто drop_duplicates (), так как это потеряло бы данные).

Я хотел бы иметь возможность принудительно создавать строки, которые имеют одинаковые значения [даты, имени] в одну строку, если они могут быть успешно конвергированы на основе определенных значений, которые являются NaN (аналогично поведению comb_first()). Например, приведенное выше значение будет

date, name, value1, value2, value3, value4
1/1/2001,ABC,1,1,2,35

Если два значения отличаются друг от друга, а одно не NaN, две строки не должны конвергироваться (это, вероятно, будет ошибкой, о которой мне нужно будет следить).

(Чтобы расширить приведенный выше пример, фактически может быть произвольное количество строк - задано произвольное количество столбцов, которое должно быть сведено к одной отдельной строке.)

Это похоже на проблему, которая должна быть очень разрешимой с помощью pandas, но мне сложно разобраться в элегантном решении.

Ответ 1

Предположим, что у вас есть функция combine_it, которая, учитывая набор строк, которые будут иметь повторяющиеся значения, возвращает одну строку. Сначала группа date и name:

grouped = data.groupby(['date', 'name'])

Затем просто примените функцию агрегации и бум, который вы сделали:

result = grouped.agg(combine_it)

Вы также можете предоставить различные функции агрегации для разных столбцов, передав agg a dict.

Ответ 2

Если у вас нет числовых значений поля, агрегирование с помощью count, min, sum и т.д. не будет ни возможным, ни разумным. Тем не менее, вы все же можете захотеть свернуть дубликаты записей на отдельные записи (например, на основе одного или нескольких первичных ключей).

# Firstly, avoid Nan values in the columns you are grouping on!
df[['col1', 'col2']] =  df[['col1', 'col2']].fillna('null')


  # Define your own customized operation in pandas agg() function
df = df.groupby(['col1', 'col2']).agg({'SEARCH_TERM':lambda x: ', '.join(tuple(x.tolist())),

                                     'HITS_CONTENT':lambda x: ', '.join(tuple(x.tolist()))}
                                   )

Группируйте по одному или нескольким столбцам и сворачивайте значения значений, сначала конвертируя их, чтобы перечислить, а затем закодировать и, наконец, строку. Если вы предпочитаете, вы также можете хранить их в виде списка или кортежа, хранящихся в каждом поле, или применять их с помощью agg. функции и словаря очень разные операции с разными столбцами.

Ответ 3

Поскольку значения столбца не повторяются, вы можете использовать трюк функции agg следующим образом:

data.groupby(['date', 'name']).agg('sum')