分组并汇总列,但如果值不匹配则创建NaN

时间:2018-08-20 16:33:36

标签: python python-3.x pandas

我有一个如下数据框:

test = pd.DataFrame({'ID':[4, 5, 6, 6, 6, 7, 7, 7], 'val1':['one', 'one', 'two', 'two', 'three', np.nan, 'seven', 'seven'], 'val2':['hi', 'bye', 'hola', 'hola', 'hola', 'ciao', 'ciao', 'namaste'], 'val3':[3, 3, 4, np.nan, 4, 5, 5, 6]})

test
   ID   val1     val2  val3
0   4    one       hi   3.0
1   5    one      bye   3.0
2   6    two     hola   4.0
3   6    two     hola   NaN
4   6  three     hola   4.0
5   7    NaN     ciao   5.0
6   7  seven     ciao   5.0
7   7  seven  namaste   6.0

每个ID都有一些测量值,有些ID重复三次。

如果特定列的复制ID之间存在分歧,那么我希望新数据框具有该值的NaN。

如果一个值已经存在一个NaN(考虑不进行测量),但是该重复样本中的另外两个已匹配,那么我希望该一致性出现在最终数据帧中。如果存在值的两者之间存在分歧,则为NaN。

我当时在考虑使用pandas groupby然后进行聚合,但是我不确定如何对聚合函数进行逻辑处理。

基本上,我正在寻找的输出如下:

pd.DataFrame({'ID':[4, 5, 6, 7], 'val1':['one', 'one', np.nan, 'seven'], 'val2':['hi', 'bye', 'hola',  np.nan], 'val3':[3, 3, 4, np.nan]})

   ID   val1  val2  val3
0   4    one    hi   3.0
1   5    one   bye   3.0
2   6    NaN  hola   4.0
3   7  seven   NaN   NaN

您能建议怎么做吗?

谢谢!

杰克

2 个答案:

答案 0 :(得分:6)

使用

(
 concat(
   substring(to_char(A.time1), 1, 5)
 , substring(to_char(A.time2), 6)
 )
) interpolate previous value B.time

答案 1 :(得分:5)

之所以有效,是因为您如何定义问题。

首先,获取每个ID的第一行。接下来,找出哪些ID具有有效值并屏蔽其他所有内容。

v = df.groupby('ID', as_index=False).first()
v[df.groupby('ID', as_index=False).nunique().eq(1)]

   ID   val1  val2  val3
0   4    one    hi   3.0
1   5    one   bye   3.0
2   6    NaN  hola   4.0
3   7  seven   NaN   NaN