2015-12-16 86 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