Я искал вокруг, пытался получить примеры, но не могу заставить его работать так, как я хочу.

Я хочу дедуплицировать по 'OrderID' и извлекать дубликаты для разделения CSV. Главное, мне нужно иметь возможность изменить столбец, по которому я хочу дедуплировать, в данном случае это «Код заказа».

Пример набора данных:

ID    Fruit   Order ID    Quantity    Price
1     apple      1111        11       £2.00
2     banana     2222        22       £3.00
3     orange     3333        33       £5.00
4     mango      4444        44       £7.00
5     Kiwi       3333        55       £5.00

Выход:

ID    Fruit   Order ID    Quantity    Price
5     Kiwi       3333        55       £5.00

Я пробовал это:

import pandas as pd

df = pd.read_csv('C:/Users/shane/PycharmProjects/PythonTut/deduping/duplicate example.csv')

new_df = df[['ID','Fruit','Order ID','Quantity','Price']].drop_duplicates()

new_df.to_csv('C:/Users/shane/PycharmProjects/PythonTut/deduping/duplicate test.csv', index=False)

У меня есть проблема, это не удаляет дубликаты.

0
shaneo 15 Апр 2020 в 21:49

2 ответа

Лучший ответ

Вы можете достичь этого, создав новый фрейм данных с помощью value_counts (), слияния и фильтрации.

# value_counts returns a Series, to_frame() makes it into DataFrame
df_counts = df['OrderID'].value_counts().to_frame()
# rename the column
df_counts.columns = ['order_counts']

# merging original on column "OrderID" and the counts by it's index
df_merged = pd.merge(df, df_counts, left_on='OrderID', right_index=True)

# Then to get the ones which are duplicate is just the ones that count is higher than 1
df_filtered = df_merged[df_merged['order_counts']>1]

# if you want everything else that isn't a duplicate
df_not_duplicates = df_merged[df_merged['order_counts']==1]

edit: drop_duplicates () сохраняет только уникальные значения, но при обнаружении дубликатов удалит все значения, кроме одного . Какой из них оставить для вас, установите его аргументом «держать», который может быть «первым» или «последним»

edit2: из вашего комментария вы хотите экспортировать результат в CSV. Помните, как я это делал выше, я разделил 2 DataFrames:

А) Все элементы, у которых удален дубликат (df_not_duplicates)

Б) Только элементы с дубликатом все еще дублируются (df_filtered)

# Type 1 saving all OrderIds that had duplicates but still with duplicates:
df_filtered.to_csv("path_to_my_csv//filename.csv", sep=",", encoding="utf-8")

# Type 2, all OrderIDs that had duplicate values, but only 1 line per OrderID
df_filtered.drop_duplicates(subset="OrderID", keep='last').to_csv("path_to_my_csv//filename.csv", sep=",", encoding="utf-8")
1
mrbTT 15 Апр 2020 в 19:41

Ошибка во второй строке кода (вы должны использовать pd.DataFrame), если вы хотите использовать метод drop_duplicates.

df = pd.read_csv('C:/Users/shane/PycharmProjects/PythonTut/deduping/duplicateexample.csv')

# Create dataframe with duplicates
raw_data = {'ID': [1,2,3,4,5], 
            'Fruit': ['apple', 'Banana', 'Orange','Mango', 'Kiwi'], 
            'Order ID': [1111, 2222, 3333, 4444, 5555], 
        'Quantity': [11, 22, 33, 44, 55],
        'Price': [ 2, 3, 5, 7, 5]}

new_df = pd.DataFrame(raw_data, columns = ['ID','Fruit','Order ID','Quantity','Price']).drop_duplicates()

new_df.to_csv('C:/Users/shane/PycharmProjects/PythonTut/deduping/duplicate test.csv', index=False)

Надеюсь, это поможет.

0
techPirate99 15 Апр 2020 в 20:04