2015-12-16 8 views
2

Я пытаюсь суммировать все value где date1 соответствует date2 для каждой строки в моей dataframe, который похож на этот 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

Проблема с: 'х [ '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 где использовать другой apply с replace0 к NaN:

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_. – tbk

Смежные вопросы