Python 如果有两个以上的唯一值,则过滤df-熊猫
我有一个df,它包含不同时间点的值。我有两个单独的列,它们应该为每个时间点显示一组唯一的值。大多数情况下都会发生这种情况,但有时时间点包含多个唯一值。我希望用条件逻辑过滤这些 对于下面的df,在Python 如果有两个以上的唯一值,则过滤df-熊猫,python,pandas,Python,Pandas,我有一个df,它包含不同时间点的值。我有两个单独的列,它们应该为每个时间点显示一组唯一的值。大多数情况下都会发生这种情况,但有时时间点包含多个唯一值。我希望用条件逻辑过滤这些 对于下面的df,在time中有唯一的时间点。我只想为每个时间点的Value和Object设置一组唯一值。如果在Value中出现两个唯一的项,我想删除X并保留Y,而不管对象中是什么。如果Object中有两个唯一的项,那么我想保留第一行。在本例中,值中的项目将相同 df = pd.DataFrame({
time
中有唯一的时间点。我只想为每个时间点的Value
和Object
设置一组唯一值。如果在Value
中出现两个唯一的项,我想删除X
并保留Y
,而不管对象中是什么。如果Object
中有两个唯一的项,那么我想保留第一行。在本例中,值中的项目将相同
df = pd.DataFrame({
'Time' : ['2019-08-02 09:50:10.1','2019-08-02 09:50:10.1','2019-08-02 09:50:10.2','2019-08-02 09:50:10.2','2019-08-02 09:50:10.3','2019-08-02 09:50:10.3','2019-08-02 09:50:10.4','2019-08-02 09:50:10.4','2019-08-02 09:50:10.6','2019-08-02 09:50:10.6'],
'Object' : ['A','A','B','B','C','A','C','B','B','B'],
'Value' : ['X','X',np.nan,np.nan,'Y','X','Y','Y','Z','Z'],
})
我最初考虑在每个时间点返回包含多个唯一项目集的行,这些行可用于过滤
unq_Object = df.groupby('Time').apply(lambda x: x['Object'].unique())
unq_Value = df.groupby('Time').apply(lambda x: x['Value'].unique())
但我不确定是否有更有效的方法
预期产出:
Time Object Value
0 2019-08-02 09:50:10.1 A X
1 2019-08-02 09:50:10.1 A X
2 2019-08-02 09:50:10.2 B NaN
3 2019-08-02 09:50:10.2 B NaN
4 2019-08-02 09:50:10.3 C Y
5 2019-08-02 09:50:10.4 C Y
6 2019-08-02 09:50:10.6 B Z
7 2019-08-02 09:50:10.6 B Z
更新使用replicate
df[df.duplicated(keep=False)|df.index.isin(df.groupby('Time').head(1).index)]
Out[187]:
Time Object Value
0 2019-08-02 09:50:10.1 A X
1 2019-08-02 09:50:10.1 A X
2 2019-08-02 09:50:10.2 B NaN
3 2019-08-02 09:50:10.2 B NaN
4 2019-08-02 09:50:10.3 C Y
6 2019-08-02 09:50:10.4 C Y
8 2019-08-02 09:50:10.6 B Z
9 2019-08-02 09:50:10.6 B Z
如果所有时间都有多个
我们能做到
df[df.Time.duplicated()|df.duplicated(keep=False)]
我已经包括了更多的信息谢谢@WeNYoBen,这对于对象中的重复值非常有效。但是值中的重复项可能不起作用。如果Y
在X
之前排序,则没有问题,但如果在X
之后排序,则会将其删除。我对您的预期输出感到困惑。我正在打印您的数据帧,似乎正是这样。示例df有10行,我的输出有8行?无需告诉我;)