【问题标题】:How to aggregate some column while keeping others in Python如何聚合某些列,同时将其他列保留在 Python 中
【发布时间】:2019-07-19 14:35:21
【问题描述】:

我有一个包含>100 variables 的数据集,但为了说明问题,我将其简化如下。

我想groupby()colA,colBsum()colD,同时取colCcolE的不同值

我已经尝试过以下方法,但正如您所知,这只会返回我分组的列和我总结的列,并且永远不会返回 colCcolE

方法1: df.groupby(['colA','colB').aggregate({'colC': sum})

方法2:我可以像上面那样聚合它们,然后稍后将其加入同一个表以获得结果。

approach3: 在 groupby 中包含所有列,但是当我这样做时,我无法按照 Missing 的值进行分组,就像您在 colE 中看到的那样

我有什么选择?

更正 更新:我刚刚更正了我之前呈现数据的方式,它不正确

data = [
    ["25-5-19", "cat1", "cat3", 10, 1],
    ["25-5-19", "cat1", "cat3", 20, 1],
    ["25-5-19", "cat1", "cat3", 30, 1],
    ["26-5-19", "cat2", "cat4", 50, 2],
    ["26-5-19", "cat2", "cat4", 100, 2],
    ["26-5-19", "cat2", "cat4", 10, 2],
    ["27-5-19", "cat1", "cat5", 40, None],
    ["27-5-19", "cat1", "cat5", 60, None]
] 

`

【问题讨论】:

  • 我有一个库,用于受 knime 启发的更复杂的数据框操作。您可以检查一下,看看是否有任何功能可以帮助您的情况。 github.com/gokhangerdan/knime2python Groupby 函数在第 200 行。
  • 取 colC 的不同值你想要nunique()吗?
  • @QuangHoang,您的问题帮助我找到了立即对我有用的以下解决方案。谢谢!

标签: python pandas pandas-groupby


【解决方案1】:

看来你需要

df['New']=df.groupby(['colA','colB'])['colC'].transform('sum')

【讨论】:

    【解决方案2】:

    我想 groupby() colA,colB 和 sum() colD,同时取 colC 和 colE 的不同值

    所以我相信你可以在聚合器中使用 set 并在完成后使用 reset_index()

    # dataframe data from example (+ extra `cat1` in ColC)
    data = [
        ["25-5-19", "cat1", "cat1", 10, 1],
        ["25-5-19", "cat1", "cat3", 20, 1],
        ["25-5-19", "cat1", "cat3", 30, None],
        ["26-5-19", "cat2", "cat4", 50, 2],
        ["26-5-19", "cat2", "cat4", 100, 2],
        ["26-5-19", "cat2", "cat4", 10, 2]
    ] 
    
    df = pd.DataFrame(data, columns = ['colA', 'colB', 'colC', 'colD', 'colE']) 
    
    # aggregator sums over `colD` and gets distinct values of `colC` and `colE`
    df.groupby(['colA', 'colB']).aggregate({'colD': sum, 'colC': set, 'colE': set}).reset_index()
    
    
    | - | colA  |colB   | colE         | colD   | colC          |
    |---|-------|-------|--------------|--------|---------------|
    |0  |25-5-19|  cat1 |   {nan, 1.0} |  60    |  {cat3, cat1} |
    |1  |26-5-19|  cat2 |   {2.0}      |  160   |   {cat4}      |
    

    【讨论】:

      【解决方案3】:
      df = pd.DataFrame(data, columns = ['colA', 'colB', 'colC', 'colD', 'colE']) 
      
      df['colE'] = df['colE'].fillna(-1)# I replaced all NaN with -1 to avoid `function not reduce error`
      
      df.groupby(['colA','colB']).aggregate({'colD':sum,'colC':np.unique,'colE':np.unique})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-05
        • 2016-07-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 2017-04-07
        • 1970-01-01
        • 2020-02-10
        相关资源
        最近更新 更多