我有下面的数据集,包括刷卡次数和刷卡时间。输出必须是唯一的卡和它被刷的日期,即如果一张卡在一天中被多次刷,那么输出应该包含一张卡和它第一次被扫描的时间。。欢迎任何关于如何开始使用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发布于 2019-09-20 01:27:04
在card和date上尝试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发布于 2019-09-20 01:59:42
假设您的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发布于 2019-09-20 01:43:29
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)https://stackoverflow.com/questions/58016074
复制相似问题