python - 聚合 pandas 数据框和字符串条目

标签 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

我想 reshape 数据框以便获得信息

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 (但我不知道如何重现它作为示例)。

最佳答案

选项 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 调用会删除多余的行。

关于python - 聚合 pandas 数据框和字符串条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48334297/

相关文章:

sql-server - pyodbc 的参数化创建查询

python - 使用 Flask-SQLAlchemy 和 Flask-Marshmallow 聚合连接查询

python - 从第一个标签中获取一个简单的字符串

python - 将带有 DatetimeIndex 的 Pandas DataFrame 按 na 或缺失的行拆分为 block

python - 在 Pandas (Python 3) 中用 0 替换空白

python - 如何对 Pandas 中的一组空列进行分组?

python - Pandas,如何从系列中的所有值中减去第一行值?

python - 后台进程的 cy.exec 超时

python - 如何在 keras 损失函数中使用 tf.nn.top_k?

python - Dataframe加入python