如果有两个以上唯一值,请过滤df-pandas

时间:2019-11-06 00:45:30

标签: python pandas

我有一个df,其中包含各个时间点的值。我有两个单独的列,每个时间点应显示一组唯一的唯一值。这种情况大部分发生,但有时时间点包含多个唯一值。我希望使用条件逻辑对它们进行过滤。

对于以下df,Time中有唯一的时间点。我只想为每个时间点的ValueObject设置一组唯一的值。如果Value中出现两个唯一项,则无论X中的内容如何,​​我都想放下Y并保留Object。如果Object中有两个唯一的项目,那么我想保留第一行。在这种情况下,Value中的项目将相同。

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

1 个答案:

答案 0 :(得分:1)

更新使用duplicate

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)]