首页 > 解决方案 > 熊猫放弃不变的日子

问题描述

当仪器发生故障并记录一整天的重复测量时,我需要从数据集中删除一整天。在下面的示例中,我想删除 2020-08-27 的所有行并保留 2020-08-28 的所有行。

dates = ['2020-08-27', '2020-08-27', '2020-08-27', '2020-08-28', '2020-08-28', '2020-08-28']
values = [100, 100, 100, 200, 201, 200]
df = pd.DataFrame({"date": dates, "value": values})

         date  value
0  2020-08-27    100
1  2020-08-27    100
2  2020-08-27    100
3  2020-08-28    200
4  2020-08-28    201
5  2020-08-28    200

这是我尝试过但无法正常工作的代码:

df.drop_duplicates(subset=["date", "value"], keep=False)

         date  value
4  2020-08-28    201

这样做的正确方法是什么?

编辑:事实证明,我需要它来处理多个值列。同样在这种情况下,我想保留 2020-08-28 行。

dates = ['2020-08-27', '2020-08-27', '2020-08-27', '2020-08-28', '2020-08-28', '2020-08-28', '2020-08-28']
values1 = [100, 100, 100, 200, 201, 201, 200]
values2 = [300, 300, 300, 300, 301, 301, 300]
df = pd.DataFrame({"date": dates, "value1": values1, "value2": values2})

         date  value1  value2
0  2020-08-27     100     300
1  2020-08-27     100     300
2  2020-08-27     100     300
3  2020-08-28     200     300
4  2020-08-28     201     301
5  2020-08-28     201     301
6  2020-08-28     200     300

标签: pandas

解决方案


让我们尝试groupby使用transform+nunique作为条件来切片数据帧:

df[df.groupby('date')['value'].transform('nunique').ne(1)]

输出:

         date  value
3  2020-08-28    200
4  2020-08-28    201
5  2020-08-28    200

详细信息:按天分组并检查您是否有多个不同的值。

更新以处理多列:

df[df.groupby('date')[['value1', 'value2']].transform('nunique').ne(1).all(axis=1)]

输出:

        date  value1  value2
3  2020-08-28     200     300
4  2020-08-28     201     301
5  2020-08-28     201     301
6  2020-08-28     200     300

推荐阅读