我有以下格式的数据框
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(但我不知道如何重现它作为一个例子)。
答案 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