根据列值删除重复项

时间:2020-06-05 22:44:51

标签: python pandas

我有一个看起来像这样的数据框:

timestamp            |  expectedValue   |   value    |  name
2020-04-01T00:00:00Z          0         |     231    |    a
2020-04-01T00:00:00Z          1         |     324    |    a
2020-04-01T00:00:00Z          0
2020-04-02T00:00:00Z          0
2020-04-02T00:00:00Z          1

我要删除重复值为0的重复值,并保留另一个。

什么是最好的方法?

致谢

2 个答案:

答案 0 :(得分:0)

您可以通过以下代码行获得期望的结果:

df = df.iloc[df.expectedValue.ne(1).argsort(kind='mergesort')].drop_duplicates(['timestamp'])

将按timestamp列删除重复项,并且仅返回value列不同于0的行。

玩具示例代码

下面的玩具示例代码可以按预期工作:

import pandas as pd
import numpy as np

df = pd.DataFrame([\
["2020-04-01T00:00:00Z",0,231,"a"],\
["2020-04-01T00:00:00Z",1,324,"a"],\
["2020-04-01T00:00:00Z",0,np.nan,np.nan],\
["2020-04-02T00:00:00Z",0,np.nan,np.nan],\
["2020-04-02T00:00:00Z",1,np.nan,np.nan]],\
columns=["timestamp","expectedValue","value","name"])

df = df.iloc[df.expectedValue.ne(1).argsort(kind='mergesort')].drop_duplicates(['timestamp'])

结果是:

In [40]: df
Out[40]:
              timestamp  expectedValue  value name
1  2020-04-01T00:00:00Z              1  324.0    a
4  2020-04-02T00:00:00Z              1    NaN  NaN

答案 1 :(得分:0)

如果我理解正确,您只想将expectedValue = 0放在timestamp的副本上。也就是说,您要保留expectedValue = 0的单个(非重复)时间戳。

尝试一下:

m = df.expectedValue.ne(0)
m1 = df.timestamp.duplicated(keep=False)

df_final = df[~m1 | (m1 & m)]

Out[96]:
              timestamp  expectedValue  value name
1  2020-04-01T00:00:00Z              1  324.0    a
4  2020-04-02T00:00:00Z              1    NaN  NaN