【问题标题】:Iterating through Pandas Groupby and Merging DataFrames遍历 Pandas Groupby 并合并 DataFrame
【发布时间】:2014-10-17 06:34:31
【问题描述】:

这似乎应该是直截了当的,但却难倒我。真的很喜欢能够遍历 groupby 操作的组,并且我从 groupby 获得了我想要的结果,但我无法将最终结果合并到一个数据帧中。所以基本上我有下面的代码可以捕获列表中的数据帧,但我不知道如何循环遍历数据帧列表来制作一个数据帧:

dfs = []
for name, group in df.groupby('date', sort=False):
    dfs.append(pd.DataFrame(pd.DataFrame(list(chain.from_iterable(group['values'])),
                              columns=['col']).groupby('col').size(),
                               columns=[name]).reset_index())

我得到以下信息(仅显示 dfs[0] 和 dfs[1] 但我最多有 dfs[8]:

   [   col1 col2
    0  val1 val2,
    ...
       col1 col2
    0  val1 val2]
    ...

我只想将它们全部合并到 col1 键上。换句话说,下面的工作很好,但我如何在不硬编码列表中的单个元素并在 dfs 中循环遍历所有元素的情况下做到这一点?

pd.concat([dfs[0], dfs[1]], axis=1, join='outer')

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    为什么不只是:

    pd.concat(dfs, axis=1, join='outer')
    

    【讨论】:

    • 感谢您的回复。我不知道为什么我没有尝试。那行得通。
    【解决方案2】:

    因为这必须在一个非常大的数据集上工作,所以我采用了以下实现,它看起来一点也不优雅,但在大型数据集上表现得很好:

    for name, group in df.groupby('date', sort=False):
        dfs.append(pd.DataFrame(pd.DataFrame(list(chain.from_iterable(group['values'])),
                                  columns=['key']).groupby('key').size(),
                                   columns=[name.strftime('%Y-%m-%d')]).reset_index())
    
    df2 = pd.concat(dfs, axis=1, join='outer')
    
    df3 = pd.merge(pd.merge(pd.merge(pd.merge(pd.merge(pd.merge(pd.merge(pd.merge(df2.iloc[:, :2], 
            pd.DataFrame(list(set(chain.from_iterable(df['values']))), columns=['key']), how='right'),
                df2.iloc[:, 2:4], how='left'),
                df2.iloc[:, 4:6], how='left'),
                df2.iloc[:, 6:8], how='left'),
                df2.iloc[:, 8:10], how='left'),
                df2.iloc[:, 10:12], how='left'),
                df2.iloc[:, 12:14], how='left'),
                df2.iloc[:, 14:16], how='left').fillna(0).set_index('key').sort_index(axis=1)
    

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 2018-12-09
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2023-03-24
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多