Сохранение дублирующейся строки, определенной элементом - PullRequest
0 голосов
/ 04 июля 2018

Проблема: Сохранение только одной строки дубликатов (Дата), определенной элементом.

Скажем, у вас есть DataFrame с повторяющимися датами:

       Name    Item    Date        value1  value2
...
1235   Marc    A       21-Dec-17   7       1000
1236   Marc    H       05-Jan-18   9       2000
1237   Marc    Q       27-Jul-18   4       500
1238   John    H       14-Dec-17   4       500
1239   John    Q       07-Feb-18   6       500
1240   John    A       07-Feb-18   8       1000
1241   John    H       07-Feb-18   2       1000
1242   John    A       05-Dec-21   7       1000
1243   John    Q       27-Aug-25   8       500
1244   John    H       27-Aug-25   4       700
...

Уникальные значения col Item: t = ['A', 'H', 'Q']. Ранжирование по значимости t будет: A, Q и последний H.

Так, например. строки 1239-1241 я хотел бы оставить только строку 1240, а строки 1243-1244 - только 1243.

Я изо всех сил пытаюсь сделать это без построчной итерации по dataframe. И поскольку dataframe огромен, я ищу более быстрое решение. Есть ли элегантный способ сделать это?

1 Ответ

0 голосов
/ 04 июля 2018

Использование:

df['Item'] = pd.Categorical(df['Item'], categories= ['H','Q','A'], ordered=True)
df['Date'] = pd.to_datetime(df['Date'])

df = df.sort_values(['Date','Item'], ascending=[True, False]).drop_duplicates('Date')
print (df)
      Name Item       Date  value1  value2
1238  John    H 2017-12-14       4     500
1235  Marc    A 2017-12-21       7    1000
1236  Marc    H 2018-01-05       9    2000
1240  John    A 2018-02-07       8    1000
1237  Marc    Q 2018-07-27       4     500
1242  John    A 2021-12-05       7    1000
1243  John    Q 2025-08-27       8     500

Объяснение

  1. Сначала преобразовать Item столбец в упорядоченные категории
  2. Преобразование дат на to_datetime
  3. Сортировка по sort_values по обоим столбцам и последним drop_duplicates

Если хотите проверить дубликаты по столбцу Name:

df = df.sort_values(['Name','Item'], ascending=False).drop_duplicates('Name')
print (df)
      Name Item       Date  value1  value2
1236  Marc    H 2018-01-05       9    2000
1238  John    H 2017-12-14       4     500

А Name и Date с:

df = df.sort_values(['Name','Date','Item'], ascending=False).drop_duplicates(['Name', 'Date'])
print (df)
      Name Item       Date  value1  value2
1237  Marc    Q 2018-07-27       4     500
1236  Marc    H 2018-01-05       9    2000
1235  Marc    A 2017-12-21       7    1000
1244  John    H 2025-08-27       4     700
1242  John    A 2021-12-05       7    1000
1241  John    H 2018-02-07       2    1000
1238  John    H 2017-12-14       4     500
...