【问题标题】:Sum duplicate rows in two columns in Pandas dataframe by index [duplicate]按索引对 Pandas 数据框中两列中的重复行求和 [重复]
【发布时间】:2017-08-09 05:08:39
【问题描述】:

我有以下数据框,从 csv 读入 pandas。

           Fruit    Apple   Pear
Date                  
2016-03-30  Pear            1
2016-04-14  Pear            1
2016-04-14  Pear            1
2016-05-09  Apple   1
2016-05-18  Apple   1   
2016-06-24  Pear            1
2016-06-27  Apple   1   
2016-06-27  Pear            1
2016-06-28  Apple   1   
2016-06-28  Apple   1   
2016-07-05  Pear            1

我希望它看起来像这样。它对重复的行求和,然后删除重复的行。 Fruit 列中的值此时无关紧要。我稍后会删除该列。

           Fruit    Apple   Pear
Date                  
2016-03-30  Pear            1
2016-04-14  Pear            2
2016-05-09  Apple   1
2016-05-18  Apple   1   
2016-06-24  Pear            1
2016-06-27  Apple   1       1
2016-06-28  Apple   2   
2016-06-28  Apple   1   
2016-07-05  Pear            1

我尝试使用 groupby,但它用 1 填充了 Apple/Pear 列。我尝试了一个 for 循环,如果下一个日期索引与当前日期索引相同,它将 += 1 到相应的 Apple/Pear 列。那失败了,因为列的类型,以及我更改列类型的尝试也失败了。用我的头撞这个,我无法得到它。

我能做的一件事是用df = df.reset_index().drop_duplicates('Date',keep='last').set_index('Date')删除重复项

【问题讨论】:

  • 阅读this 了解如何提出一个好的熊猫问题可能会有所帮助。您发布的帧有些难以解析,不清楚 2016-03-30/Apple 的值是 0 还是 NaN,并且您出于某种原因将其抑制为空字符串等。

标签: python pandas


【解决方案1】:

IIUC 你需要 groupby 按索引 - level=0 和聚合 sum

df = df.groupby(level=0).sum()
print (df)
            Apple  Pear
Date                   
2016-03-30    NaN   1.0
2016-04-14    NaN   2.0
2016-05-09    1.0   NaN
2016-05-18    1.0   NaN
2016-06-24    NaN   1.0
2016-06-27    1.0   1.0
2016-06-28    2.0   NaN
2016-07-05    NaN   1.0

如果需要cumsumNoobie,谢谢:

df = df.groupby(level=0).cumsum() 
print (df)
            Apple  Pear
Date                   
2016-03-30    NaN   1.0
2016-04-14    NaN   1.0
2016-04-14    NaN   2.0
2016-05-09    1.0   NaN
2016-05-18    1.0   NaN
2016-06-24    NaN   1.0
2016-06-27    1.0   NaN
2016-06-27    NaN   1.0
2016-06-28    1.0   NaN
2016-06-28    2.0   NaN
2016-07-05    NaN   1.0

【讨论】:

  • df = df.groupby(level=0).sum().min().max().cumsum() 也可以
  • @Noobie - 谢谢你的建议,也许你觉得像df.groupby(level=0).cumsum().reset_index().drop_duplicates('Date', keep='last')
  • 是的,效率更高 ?
  • 感谢您的建议。 Noobie 在AttributeError: 'str' object has no attribute 'cumsum'的结果@
  • @jezrael's 给出了这个pandas.core.base.DataError: No numeric types to aggregate。 df dtype 是对象。这就是试图对它们求和或求和的问题吗?
【解决方案2】:

你可以试试这个

df.groupby(['Date','Fruit']).agg('sum')

我刚刚意识到这是一个重复的问题,see this

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多