首页 文章

使用字符串条目聚合pandas数据帧

提问于
浏览
1

我有一个以下形式的数据框

df = pd.DataFrame({'Start':['47q2',None, None,'49q1',None,None],
              'Threshold':[None, '47q3', None,None, '49q2', None],
              'End':[None, None, '48q1',None, None, '50q2'],
              'Series':['S1','S1','S1','S2','S2','S2']})

    End Series Start Threshold
0  None     S1  47q2      None
1  None     S1  None      47q3
2  48q1     S1  None      None
3  None     S2  49q1      None
4  None     S2  None      49q2
5  50q2     S2  None      None

我想重塑数据帧,以便获得信息

df_wanted = pd.DataFrame({'Start':['47q2','49q1'],
              'Threshold':['47q3','49q2'],
              'End':['48q1','50q2'],
              'Series':['S1','S2']})

    End Series Start Threshold
0  48q1     S1  47q2      47q3
1  50q2     S2  49q1      49q2

也就是说,我希望每个系列只占用一行,并在其他列中获得有关开始,结束和阈值的信息 .

我尝试使用groupby和agg - 但是因为它们是字符串,所以我无法使用它 . 我不确定什么样的功能可以实现这一目标 .

我不确定它是否有任何区别,这个数据帧是由另一个构成的,它有无条目 - 但是这个数据帧显示为NaN(但我不知道如何重现它作为一个例子) .

2 回答

  • 1

    Option 1
    使用 groupby first .

    df.groupby('Series', as_index=False).first()
    
      Series   End Start Threshold
    0     S1  48q1  47q2      47q3
    1     S2  50q2  49q1      49q2
    

    Option 2
    使用 groupby apply 的较慢解决方案 .

    df.groupby('Series').apply(lambda x: x.bfill().ffill()).drop_duplicates()
    
        End Series Start Threshold
    0  48q1     S1  47q2      47q3
    3  50q2     S2  49q1      49q2
    

    应用逻辑填充漏洞,最后的 drop_duplicates 调用会丢弃冗余行 .

  • 1

    set_index stack

    df.set_index('Series').stack().unstack().reset_index()
    Out[790]: 
      Series   End Start Threshold
    0     S1  48q1  47q2      47q3
    1     S2  50q2  49q1      49q2
    

相关问题