我有一个df,其中包含各个时间点的值。我有两个单独的列,每个时间点应显示一组唯一的唯一值。这种情况大部分发生,但有时时间点包含多个唯一值。我希望使用条件逻辑对它们进行过滤。
对于以下df,Time
中有唯一的时间点。我只想为每个时间点的Value
和Object
设置一组唯一的值。如果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
答案 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)]