Python 熊猫-如何设置选择要删除哪些副本的规则

Python 熊猫-如何设置选择要删除哪些副本的规则,python,pandas,Python,Pandas,我有一个数据集,列和索引datetime对象中都有值。 我想做的是删除索引日期和时间相同的值,但我想制定如下规则: 对于同一日期时间,我有两个值,所以我想选择一个更接近数字X的值。例如,这个数字可以是整个数据集的平均值 数据集看起来是这样的,我在尝试执行此操作时重置了索引,因为使用多个索引时出错: index kwh 16391 2014-10-26 03:14:59 0.0514139 16392 2014-10-26 03:

我有一个数据集,列和索引datetime对象中都有值。 我想做的是删除索引日期和时间相同的值,但我想制定如下规则:

对于同一日期时间,我有两个值,所以我想选择一个更接近数字X的值。例如,这个数字可以是整个数据集的平均值

数据集看起来是这样的,我在尝试执行此操作时重置了索引,因为使用多个索引时出错:

         index                  kwh
16391   2014-10-26 03:14:59     0.0514139
16392   2014-10-26 03:29:59     0.0323344
16393   2014-10-26 03:29:59     12.3
16394   2014-10-26 03:44:59     0.0595618
16395   2014-10-26 03:59:59     0.0338677
例如,如果X的平均值是0.05,那么我想要得到的是

16391   2014-10-26 03:14:59     0.0514139
16392   2014-10-26 03:29:59     0.0323344
16393   2014-10-26 03:44:59     0.0595618
16394   2014-10-26 03:59:59     0.0338677
我尝试过使用groupby,并以几种不同的方式应用,但我无法让它发挥作用。 有什么帮助吗?

如果您在数据框中添加一个dist列来测量绝对距离 在kwh和X之间:

然后,您可以按索引分组,并找到每个组具有最小距离的唯一整数索引:

idx = df.groupby(['index'])['dist'].transform(lambda x: x == x.min()).astype(bool)
然后可以使用df.loc选择这些行:

如果数据包含相同指数的重复kwh值:

然后

屈服

                     index       kwh      dist
16391  2014-10-26 03:14:59  0.051414  2.033505
16392  2014-10-26 03:29:59  0.032334  2.052584
16392  2014-10-26 03:29:59  0.032334  2.052584
16394  2014-10-26 03:44:59  0.059562  2.025357
16395  2014-10-26 03:59:59  0.033868  2.051051
注意,通过在这里使用transform,我们得到了一个布尔掩码,它允许我们选择所有行,包括那些重复值为kwh的行,这些行与X的距离最小


您可以使用del df['dist']在不再需要时删除dist列。

请发布原始输入数据和代表性df以及所需的输出,我刚刚更新了它。是的,我已经认为可以用类似的方法完成,或者如果我获取所有重复值,我不需要获取整个数据集,我想会快得多。另外,如何获取所有重复的值,包括第一个值?如果我有两个相同的值。duplicated将只返回第二个值。虽然我想知道你是否可以使用lambda、apply和groupby立即完成。我很难理解你在说什么。您能创建一个具有所需输出的示例数据帧吗?我想了一种方法来实现它,我认为它会更快,但现在我有一个不同的问题。我现在试图做的是,通过索引获取所有重复的值,但我做不到。我会使用df.duplicatedsubset=df.index,但这会跳过特定索引第一次出现的时间。例如,如果我有df:>索引kwh>2014-10-26 03:14:59 0.051414>2014-10-26 03:14:59 0.624514>2014-10-26 03:29:59 0.032334 df.duplicated将只返回0.624514值,我需要0.624514和0.051414。很抱歉,我试图在注释中插入代码。我做不到。最好编辑您的原始Q,并将代码和问题放在那里。我编辑了我的答案,以显示保留重复值为kwh的行的方法。
df.loc[idx]
         index                  kwh
16391   2014-10-26 03:14:59     0.0514139
16392   2014-10-26 03:29:59     0.0323344
16392   2014-10-26 03:29:59     0.0323344
16393   2014-10-26 03:29:59     12.3
16394   2014-10-26 03:44:59     0.0595618
16395   2014-10-26 03:59:59     0.0338677
import pandas as pd

df = pd.read_table('data', sep='\s{2,}')
print(df)
X = df['kwh'].mean()
df['dist'] = (df['kwh'] - X).abs()
idx = df.groupby(['index'])['dist'].transform(lambda x: x == x.min()).astype(bool)
print(df.loc[idx])
                     index       kwh      dist
16391  2014-10-26 03:14:59  0.051414  2.033505
16392  2014-10-26 03:29:59  0.032334  2.052584
16392  2014-10-26 03:29:59  0.032334  2.052584
16394  2014-10-26 03:44:59  0.059562  2.025357
16395  2014-10-26 03:59:59  0.033868  2.051051