2015-12-16 79 views
2

我试图总结所有value其中date1匹配date2为我的数据框中的每一行,这是类似于此question基于另一个DataFrame列值的条件总和

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 

我试过以下,但继续得到“长度必须匹配比较”错误。

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

希望有任何建议!

+0

问题是:'X [ 'DATE1' ] == df ['date2']',系列有不同的长度。 – jezrael

+0

IIUC不会给你你想要的东西:'df1 = df.set_index('id') df1.loc [df1 ['date1']。isin(df1 ['date2']),'value']的.sum(级别= 0)'? – EdChum

回答

1

可以apply功能groupby其中与使用其他applyreplace0NaN

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 
+0

谢谢,但实际上我试图在我的例子中达到'sum'列。对不起,如果不明确。 – tbk

+0

谢谢,但是这忽略了'id',因此不完全是我需要的。但感谢您的及时回复! – tbk

+0

它的工作原理!感谢jezrael,感谢您的帮助! – tbk

0

您可以使用此应用功能:

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) 
+0

谢谢,但是这也忽略了'id'字段。我尝试过'df ['sum2'] = grp [“date2”]。apply(checkSum)'但是得到_Series长度必须匹配compare_error。 – tbk