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

时间:2018-01-19 04:51:44

标签: python pandas

我有以下格式的数据框

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 个答案:

答案 0 :(得分:1)

选项1
使用groupby + first

df.groupby('Series', as_index=False).first()

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

选项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 :(得分: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