python数据帧基于列删除重复项

2024-05-14 23:44:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的数据集,包括刷卡和刷卡时间。输出必须是唯一的卡和刷卡日期,即如果一张卡在一天内被多次刷卡,则输出应包含一张卡和第一次扫描的时间。任何关于如何开始使用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

Tags: 数据nopandasoutputtime时间card刷卡
3条回答

假设您的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

否则,你可以试试我的groupbyhead

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

carddate上尝试groupby(),并使用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

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)

相关问题 更多 >

    热门问题