2016-11-28 50 views
2

假設我有數據幀大熊貓聚集減法基於列的值

'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 

回答

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

3

解決方案pivot並減去sub

df = pd.pivot(index=df.name, columns=df.day, values=df.quantity) 
print (df.Sunday.sub(df.Monday).reset_index(name='sub_quantity')) 
    name sub_quantity 
0 A   9.0 
1 B   28.0