假设我有数据帧

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

我需要构建的是另一个数据框架,在这个数据框架中,我为每个名称从周日的数量中减去周一的数量。所以,我想我需要一个groupBy的名字,然后一个agg的函数,但我不知道如何做过滤,以便只有那些日子被考虑。
按照这个例子,我寻求的最终结果是
'name'     'sub_quantity'
'A'         9
'B'         28

最佳答案

设置

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

时机
示例数据
python - 基于列值的 Pandas 聚合减法-LMLPHP

关于python - 基于列值的 Pandas 聚合减法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40847809/

10-12 17:03