分组依据和聚合列,但如果值不匹配则创建NaN

Jac*_*tad 8 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
Run Code Online (Sandbox Code Playgroud)

每个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
Run Code Online (Sandbox Code Playgroud)

你能建议怎么做吗?

谢谢!

插口

WeN*_*Ben 6

运用

test.groupby('ID',as_index=False).agg(lambda x : x.mode()[0] if x.nunique()==1 else np.nan)
Out[372]: 
   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
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 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
Run Code Online (Sandbox Code Playgroud)