【问题标题】:Group by and aggregate columns but create NaN if values do not match分组和聚合列,但如果值不匹配则创建 NaN
【发布时间】:2018-08-20 16:33:35
【问题描述】:

我有一个如下数据框:

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

你能建议怎么做吗?

谢谢!

杰克

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    使用

    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
    

    【讨论】:

    • 需要最后一次 reset_index 调用!
    • 为什么不.agg(lambda s: s.unique().item() if s.nunique()==1 else np.nan)
    • @RafaelC 没关系,但是您调用了 unique() 两次,这似乎是多余的。也许使用一个函数?
    • 另外,这是使用 lambda,它是 ehh,... 开始。
    • @coldspeed 嗯,我的想法是不要打电话给.mode,这似乎有点矫枉过正
    【解决方案2】:

    这是因为您定义问题的方式。

    首先,获取每个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多