2013-06-23 34 views
11

Sử dụng dữ liệu mẫu:Python Pandas có điều kiện tiền

df = pd.DataFrame({'key1' : ['a','a','b','b','a'], 
       'key2' : ['one', 'two', 'one', 'two', 'one'], 
       'data1' : np.random.randn(5), 
       'data2' : np. random.randn(5)}) 

df

data1  data2  key1 key2 
0 0.361601 0.375297 a one 
1 0.069889 0.809772 a two 
2 1.468194 0.272929 b one 
3 -1.138458 0.865060 b two 
4 -0.268210 1.250340 a one 

Tôi đang cố gắng tìm ra cách để nhóm dữ liệu bằng key1 và tổng chỉ các giá trị data1 nơi khóa2 bằng ' một'.

Đây là những gì tôi đã cố gắng

def f(d,a,b): 
    d.ix[d[a] == b, 'data1'].sum() 

df.groupby(['key1']).apply(f, a = 'key2', b = 'one').reset_index() 

Nhưng điều này mang lại cho tôi một dataframe với 'Không' đánh giá cao

index key1 0 
0  a  None 
1  b  None 

Bất kỳ ý tưởng ở đây? Tôi đang tìm kiếm tương đương Pandas của SQL sau:

SELECT Key1, SUM(CASE WHEN Key2 = 'one' then data1 else 0 end) 
FROM df 
GROUP BY key1 

FYI - Tôi đã nhìn thấy conditional sums for pandas aggregate nhưng không thể thay đổi câu trả lời cung cấp đó để làm việc với khoản tiền hơn là số lượng.

Cảm ơn trước

Trả lời

20

groupby Đầu tiên cột key1:

In [11]: g = df.groupby('key1') 

và sau đó cho từng nhóm lấy subDataFrame nơi khóa2 bằng 'một' và tổng cột data1:

In [12]: g.apply(lambda x: x[x['key2'] == 'one']['data1'].sum()) 
Out[12]: 
key1 
a  0.093391 
b  1.468194 
dtype: float64 

Để giải thích những gì đang diễn ra, hãy xem nhóm 'a':

In [21]: a = g.get_group('a') 

In [22]: a 
Out[22]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
1 0.069889 0.809772 a two 
4 -0.268210 1.250340 a one 

In [23]: a[a['key2'] == 'one'] 
Out[23]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
4 -0.268210 1.250340 a one 

In [24]: a[a['key2'] == 'one']['data1'] 
Out[24]: 
0 0.361601 
4 -0.268210 
Name: data1, dtype: float64 

In [25]: a[a['key2'] == 'one']['data1'].sum() 
Out[25]: 0.093391000000000002 

Nó có thể là một chút dễ dàng hơn/rõ ràng hơn để làm điều này bằng cách hạn chế dataframe để chỉ những người có khóa2 bằng một đầu tiên:

In [31]: df1 = df[df['key2'] == 'one'] 

In [32]: df1 
Out[32]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
2 1.468194 0.272929 b one 
4 -0.268210 1.250340 a one 

In [33]: df1.groupby('key1')['data1'].sum() 
Out[33]: 
key1 
a  0.093391 
b  1.468194 
Name: data1, dtype: float64 
+0

Awesome! Tôi đang cố gắng này trên dữ liệu thực tế của tôi (có thể mất một thời gian) nhưng tôi nghĩ rằng đây là những gì tôi đang tìm kiếm. Cảm ơn rất nhiều – AllenQ

+0

Tôi nghĩ bạn có thể sử dụng bộ lọc nhóm mới ở đây ... – Jeff

+0

Chỉ cần tìm kiếm tài liệu và tìm kiếm nhanh trên google ... không thể tìm thấy chính xác những gì bạn đang đề cập đến bởi bộ lọc nhóm ... có thể bạn chỉ cho tôi đi đúng hướng? – AllenQ

Các vấn đề liên quan