首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python数据帧按列去重

python数据帧按列去重
EN

Stack Overflow用户
提问于 2019-09-20 01:19:54
回答 3查看 38关注 0票数 1

我有下面的数据集,包括刷卡次数和刷卡时间。输出必须是唯一的卡和它被刷的日期,即如果一张卡在一天中被多次刷,那么输出应该包含一张卡和它第一次被扫描的时间。。欢迎任何关于如何开始使用Python和Pandas的建议。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2019-09-20 01:27:04

carddate上尝试groupby(),并使用idxmin提取所需的行:

代码语言:javascript
复制
df.loc[df.groupby(['Card No', df['Time'].dt.date]).Time.idxmin()]

输出

代码语言:javascript
复制
    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,但首先需要创建日期:

代码语言:javascript
复制
df['date'] = df['Time'].dt.date
df.drop_duplicates(['Card No', 'date'])

输出:

代码语言:javascript
复制
    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
票数 2
EN

Stack Overflow用户

发布于 2019-09-20 01:59:42

假设您的Time列已经按照示例中的Time进行了排序,如果您希望输出中没有与所需输出相同的时间部分,您可以尝试以下方法

代码语言:javascript
复制
(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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-09-20 01:43:29

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58016074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档