基于另一个 DataFrame 列值的条件求和

Conditional Sums based on another DataFrame column value

我正在尝试对数据框中每一行的所有 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())

如有任何建议,我们将不胜感激!

您可以 apply function to groupby where use another apply with replace 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

您可以使用此应用功能:

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)