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')