基于列值的Pandas聚合减法

时间:2016-11-28 15:23:28

标签: python pandas group-by

假设我有DataFrame

'name'     'quantity'   'day'
'A'         1           'Monday'
'A'         10          'Sunday'
'A'         5           'Friday'
'B'         2           'Monday'
'B'         30          'Sunday'
'B'         5           'Thursday'

我需要构建的是另一个数据框,其中每个名称我从星期日的数量中减去星期一的数量。所以,我想我需要在{em>名称上使用groupBy,然后在agg上使用功能,但我不知道如何进行过滤,以便只有那些日子才能使用考虑。

在示例之后,我寻找的最终结果是

'name'     'sub_quantity'
'A'         9 
'B'         28 

2 个答案:

答案 0 :(得分:4)

设置

import pandas as pd
from io import StringIO

txt = """name     quantity   day
A         1           Monday
A         10          Sunday
A         5           Friday
B         2           Monday
B         30          Sunday
B         5           Thursday"""

df = pd.read_csv(StringIO(txt), delim_whitespace=True)

选项1
unstack

d1 = df.set_index(['name', 'day']).quantity.unstack()

d1.Sunday.sub(d1.Monday)

name
A     9.0
B    28.0
dtype: float64

选项2
query

s = df.set_index('name').query('day == "Sunday"').quantity
m = df.set_index('name').query('day == "Monday"').quantity
s - m

name
A     9
B    28
Name: quantity, dtype: int64

选项3
xs

d1 = df.set_index(['day', 'name']).quantity
d1.xs('Sunday') - d1.xs('Monday')

name
A     9
B    28
Name: quantity, dtype: int64

选项4
可爱apply

def obnoxious(x):
    s = x.day.eq('Sunday').idxmax()
    m = x.day.eq('Monday').idxmax()
    q = 'quantity'
    return x.get_value(s, q) - x.get_value(m, q)

df.groupby('name').apply(obnoxious)

name
A     9
B    28
dtype: int64

<强> 定时
示例数据
enter image description here

答案 1 :(得分:3)

pivot解决方案,sub减去

&amp;