我有一个看起来像这样的数据框:
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的重复值,并保留另一个。
什么是最好的方法?
致谢
答案 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