【问题标题】:Conditional Sums based on another DataFrame column value基于另一个 DataFrame 列值的条件总和
【发布时间】:2016-03-22 06:55:00
【问题描述】:

我正在尝试对所有value 求和,其中date1 与我的数据框中每一行的date2 匹配,这与question 类似。

id        value       date1       date2   sum
A         150      4/8/2014    3/8/2014   nan
B         100      5/8/2014    2/8/2014   nan
B         200      7/8/2014    5/8/2014   100
A         200      4/8/2014    3/8/2014   nan
A         300      6/8/2014    4/8/2014   350

我尝试了以下方法,但不断收到 'Lengths must match to compare' 错误。

grp = df.groupby('id')
df['sum'] = grp.apply(lambda x: x[x['date1'] == df['date2'].values]['value'].sum())

不胜感激任何建议!

【问题讨论】:

  • 问题在于:x['date1'] == df['date2'],系列有不同的长度。
  • IIUC 没有给你想要的东西:df1 = df.set_index('id') df1.loc[df1['date1'].isin(df1['date2']),'value'].sum(level=0)?

标签: python pandas sum conditional dataframe


【解决方案1】:

您可以将apply 函数转换为groupby,其中使用另一个applyreplace 0NaN

print df

#  id  value      date1      date2  sum
#0  A    150 2014-04-08 2014-03-08  NaN
#1  B    100 2014-05-08 2014-02-08  NaN
#2  B    200 2014-07-08 2014-05-08  100
#3  A    200 2014-04-08 2014-03-08  NaN
#4  A    300 2014-06-08 2014-04-08  350


def f(x):
    x['sum1'] = x.date2.apply(lambda y:  x[x.date1 == y].value.sum()).replace(0, np.nan)
    return x

df = df.groupby('id').apply(f)

print df

#  id  value      date1      date2  sum  sum1
#0  A    150 2014-04-08 2014-03-08  NaN   NaN
#1  B    100 2014-05-08 2014-02-08  NaN   NaN
#2  B    200 2014-07-08 2014-05-08  100   100
#3  A    200 2014-04-08 2014-03-08  NaN   NaN
#4  A    300 2014-06-08 2014-04-08  350   350

【讨论】:

  • 谢谢,但实际上我正在尝试在我的示例中实现 sum 列。抱歉,如果不清楚。
  • 谢谢,但这忽略了id,因此不完全是我需要的。但感谢您的及时回复!
  • 它有效!谢谢 jezrael,感谢您的帮助!
【解决方案2】:

你可以使用这个apply函数:

def checkSum(record):
    date2 = record
    sum = df[df["date1"] == date2]["value"].sum()
    if sum == 0:
        return float('nan')
    else:
        return sum

df['sum2'] = df["date2"].apply(checkSum)

【讨论】:

  • 谢谢,但这也忽略了id 字段。我尝试了df['sum2'] = grp["date2"].apply(checkSum),但得到 Series lengths must match to compare 错误。
猜你喜欢
  • 2019-10-15
  • 2020-10-16
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多