фрейм данных Python удаляет дубликаты на основе столбца - PullRequest
1 голос
/ 19 сентября 2019

У меня есть нижеприведенный набор данных, состоящий из считывания карт и времени, когда был проведен.Выходными данными должны быть уникальная карта и дата, когда она была проведена, т.е. если одна карта была проведена несколько раз в день, то выходные данные должны содержать одну карту и при первом сканировании.,Любой указатель о том, как начать использовать Python и Pandas, приветствуется.

Card No     Time 
3434    9/17/2018 5:19
3434    9/17/2018 5:57
3456    9/17/2018 5:58
3457    9/17/2018 5:59
3234    9/17/2018 6:00
3457    9/17/2018 6:07
3459    9/17/2018 6:20
3434    9/20/2018 9:35
3434    9/20/2018 9:35
3456    9/20/2018 9:41
3457    9/20/2018 9:41
3234    9/20/2018 9:43
3457    9/20/2018 9:46
3459    9/20/2018 9:46
3434    9/20/2018 9:51
3434    9/20/2018 9:52
3456    9/20/2018 9:52

Output :
Card No    Time
3434    9/17/2018
3456    9/17/2018
3457    9/17/2018
3234    9/17/2018
3459    9/17/2018
3434    9/20/2018
3456    9/20/2018
3457    9/20/2018
3234    9/20/2018
3459    9/20/2018

Ответы [ 3 ]

2 голосов
/ 19 сентября 2019

Попробуйте groupby() на card и date и используйте idxmin для извлечения необходимых строк:

df.loc[df.groupby(['Card No', df['Time'].dt.date]).Time.idxmin()]

Вывод

    Card No                Time
4      3234 2018-09-17 06:00:00
11     3234 2018-09-20 09:43:00
0      3434 2018-09-17 05:19:00
7      3434 2018-09-20 09:35:00
2      3456 2018-09-17 05:58:00
9      3456 2018-09-20 09:41:00
3      3457 2018-09-17 05:59:00
10     3457 2018-09-20 09:41:00
6      3459 2018-09-17 06:20:00
13     3459 2018-09-20 09:46:00

Вы также можете использовать drop_duplicates но сначала нужно создать дату:

df['date'] = df['Time'].dt.date
df.drop_duplicates(['Card No', 'date'])

Вывод:

    Card No                Time        date

0      3434 2018-09-17 05:19:00  2018-09-17
2      3456 2018-09-17 05:58:00  2018-09-17
3      3457 2018-09-17 05:59:00  2018-09-17
4      3234 2018-09-17 06:00:00  2018-09-17
6      3459 2018-09-17 06:20:00  2018-09-17
7      3434 2018-09-20 09:35:00  2018-09-20
9      3456 2018-09-20 09:41:00  2018-09-20
10     3457 2018-09-20 09:41:00  2018-09-20
11     3234 2018-09-20 09:43:00  2018-09-20
13     3459 2018-09-20 09:46:00  2018-09-20
1 голос
/ 19 сентября 2019

Предположим, что ваш Time столбец уже отсортирован по Time, как в вашем примере. Если вы хотите, чтобы вывод не имел временной части, как в желаемом вами выводе, вы можете попробовать следующее

(df.groupby(['Card No', df.Time.dt.date], sort=False).nth(0).drop('Time', 1)
   .reset_index())

Out[30]:
   Card No        Time
0    3434  2018-09-17
1    3456  2018-09-17
2    3457  2018-09-17
3    3234  2018-09-17
4    3459  2018-09-17
5    3434  2018-09-20
6    3456  2018-09-20
7    3457  2018-09-20
8    3234  2018-09-20
9    3459  2018-09-20

В противном случае, вы можете попробовать groupby и head

df.groupby(['Card No', df.Time.dt.date], sort=False).head(1)

Out[41]:
    Card No                Time
0     3434 2018-09-17 05:19:00
2     3456 2018-09-17 05:58:00
3     3457 2018-09-17 05:59:00
4     3234 2018-09-17 06:00:00
6     3459 2018-09-17 06:20:00
7     3434 2018-09-20 09:35:00
9     3456 2018-09-20 09:41:00
10    3457 2018-09-20 09:41:00
11    3234 2018-09-20 09:43:00
13    3459 2018-09-20 09:46:00
0 голосов
/ 19 сентября 2019

s= """3434    9/17/2018 5:19
3434    9/17/2018 5:57
3456    9/17/2018 5:58
3457    9/17/2018 5:59
3234    9/17/2018 6:00
3457    9/17/2018 6:07
3459    9/17/2018 6:20
3434    9/20/2018 9:35
3434    9/20/2018 9:35
3456    9/20/2018 9:41
3457    9/20/2018 9:41
3234    9/20/2018 9:43
3457    9/20/2018 9:46
3459    9/20/2018 9:46
3434    9/20/2018 9:51
3434    9/20/2018 9:52
3456    9/20/2018 9:52"""

raw = [row.split("    ") for row in s.split("\n")]



df = pd.DataFrame(raw, columns=["card", "time"])
df["time"] = pd.to_datetime(df.time)
df["date"] = df["time"].dt.date


## this will also keep time columns with minimum time
df.groupby(["card", "date"]).min().reset_index(level=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...