基于另一个 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
0
到 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
您可以使用此应用功能:
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)
我正在尝试对数据框中每一行的所有 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
0
到 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
您可以使用此应用功能:
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)