【问题标题】:Pandas adding only two rows inside group熊猫只在组内添加两行
【发布时间】:2018-11-02 12:15:23
【问题描述】:

我正在尝试在组中添加两行,例如:

ID   DATE   NUMBER 
1   2012-10-11   5 
1   2012-10-12   4 
1   2012-10-13   3 
2   2012-10-11   2 
2   2012-10-12   1 
2   2012-10-13   6

我只想将 2012-10-13 添加到 2012-10-12。然后删除 2012-10-13。最终结果:

ID   DATE   NUMBER 
1   2012-10-11   5 
1   2012-10-12   7 (4+3) 
2   2012-10-11   2 
2   2012-10-12   7 (6+1)

【问题讨论】:

  • 是否有逻辑可以定义为什么最后两个?在其他情况下可能是前两个?是否特定于2012-10-122012-10-13
  • 这只是一个例子。我将 ID 视为组。该问题的主要问题是如何仅添加两行(具有相同的日期或基于任何其他列值)。我不想为特定组添加所有行,只添加那两个。
  • 是的,但这两者的区别是什么?它会一直结合2012-10-122010-10-13 吗?构建仅结合这两个日期的东西似乎很愚蠢。它是组中的最后两行吗?
  • 是的,我总是将这两个日期结合起来(对于这个特定的问题)。没有特殊依赖。

标签: python python-3.x pandas pandas-groupby


【解决方案1】:

特定日期等效

  • 使用字典指定等效项
  • 使用replace 交换它们
  • 照常使用groupby

df.replace({'DATE': {'2012-10-13': '2012-10-12'}}) \
  .groupby(['ID', 'DATE'], as_index=False).sum()

   ID        DATE  NUMBER
0   1  2012-10-11       5
1   1  2012-10-12       7
2   2  2012-10-11       2
3   2  2012-10-12       7

【讨论】:

  • 非常感谢@piRSquared
  • 没问题@ArthurG。
【解决方案2】:
Import pandas as pd 

## First change the date

for i in range(len(df)): 
    if df.loc[i,'DATE'] == "2012-10-13":
        df.loc[i,'DATE'] = "2012-10-12"

## Then do a groupby sum 

df = pd.DataFrame({'SUM' : df.groupby(['ID','DATE'])['NUMBER'].sum()})

我的输出:

               SUM
ID DATE           
1  2012-10-11    5
   2012-10-12    7
2  2012-10-11    2
   2012-10-12    7

【讨论】:

  • 这也是一个非常有用的解决方案。非常感谢。
  • 很高兴@ArthurG
【解决方案3】:

警告:上面的代码可以完成你的工作,但不是进化的!

# I want to groupby ID excluding the line for 2012-10-11
df1 = df.loc[df.DATE != '2012-10-11']

# 1 - df1.groupby('ID').sum() -> I groupby ID to get the sum
# 2 - df1.drop('NUMBER', axis=1) -> I drop the col NUMBER to avoid overlaping columns
# 3 I merge the to df to get the sum value for every initial lines
df1 = df1.drop('NUMBER', axis=1).merge(df1.groupby('ID').sum(), on='ID')

# I get back the ligne for 2012-10-11
df1 = df1.append(df.loc[df.DATE == '2012-10-11'], sort=True)
df1 = df1.sort_values(['ID', 'DATE'])

# I delete the line I don't want
df1 = df1.loc[df1.DATE != '2012-10-13']

print(df1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2018-11-18
    • 2014-08-29
    • 2020-12-06
    • 2020-03-01
    • 2021-10-02
    相关资源
    最近更新 更多