2017-01-02 61 views
5

Cân nhắc dataframe tôi dfgấu trúc python có điều kiện tổng tích lũy

data data_binary sum_data 
    2  1   1 
    5  0   0 
    1  1   1 
    4  1   2 
    3  1   3 
    10  0   0 
    7  0   0 
    3  1   1 

tôi muốn để tính toán số tiền tích lũy của data_binary trong nhóm 1 giá trị tiếp giáp.

Nhóm đầu tiên của 1 có một đơn 1sum_data chỉ có 1. Tuy nhiên, nhóm thứ hai của 1 có 3 1sum_data[1, 2, 3].

Tôi đã cố gắng sử dụng np.where(df['data_binary'] == 1, df['data_binary'].cumsum(), 0) nhưng mà trả

array([1, 0, 2, 3, 4, 0, 0, 5]) 

Mà không phải là những gì tôi muốn.

+2

Bạn đã thử gì và yêu cầu của bạn là gì? Câu hỏi của bạn không rõ ràng. Chỉnh sửa nó. – MYGz

+0

Tôi muốn tính tổng dữ liệu bằng cột dữ liệu. – GrayHash

+0

vẫn không phải là đầu mối mà bạn muốn và những gì bạn đã thử không hoạt động. – dartdog

Trả lời

5

Tôi nghĩ rằng bạn có thể groupby với DataFrameGroupBy.cumsum bởi Series, nơi đầu tiên so sánh giá trị tiếp theo bằng cách shift ed cột nếu không bằng nhau (!=) và sau đó tạo nhóm theo cumsum. Cuối cùng thay 0 theo cột data_binary với mask:

print (df.data_binary.ne(df.data_binary.shift()).cumsum()) 
0 1 
1 2 
2 3 
3 3 
4 3 
5 4 
6 4 
7 5 
Name: data_binary, dtype: int32 

df['sum_data1'] = df.data_binary.groupby(df.data_binary.ne(df.data_binary.shift()).cumsum()) 
           .cumsum() 
df['sum_data1'] = df['sum_data1'].mask(df.data_binary == 0, 0) 
print (df) 
    data data_binary sum_data sum_data1 
0  2   1   1   1 
1  5   0   0   0 
2  1   1   1   1 
3  4   1   2   2 
4  3   1   3   3 
5 10   0   0   0 
6  7   0   0   0 
7  3   1   1   1 
+0

Bây giờ bạn có mũ maverick! – piRSquared

9

bạn muốn lấy số tiền tích lũy của data_binary và trừ số tiền tích lũy gần đây nhất nơi data_binary là zero.

b = df.data_binary 
c = b.cumsum() 
c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(int) 

0 1 
1 0 
2 1 
3 2 
4 3 
5 0 
6 0 
7 1 
Name: data_binary, dtype: int64 

Giải thích

Hãy bắt đầu bằng cách nhìn vào mỗi bên từng bên

cols = ['data_binary', 'cumulative_sum', 'nan_non_zero', 'forward_fill', 'final_result'] 
print(pd.concat([ 
     b, c, 
     c.mask(b != 0), 
     c.mask(b != 0).ffill(), 
     c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(int) 
    ], axis=1, keys=cols)) 


    data_binary cumulative_sum nan_non_zero forward_fill final_result 
0   1    1   NaN   NaN    1 
1   0    1   1.0   1.0    0 
2   1    2   NaN   1.0    1 
3   1    3   NaN   1.0    2 
4   1    4   NaN   1.0    3 
5   0    4   4.0   4.0    0 
6   0    4   4.0   4.0    0 
7   1    5   NaN   4.0    1 

Vấn đề với cumulative_sum là hàng nơi data_binary là số không, làm không đặt lại tổng. Và đó là động lực cho giải pháp này. Làm cách nào để chúng tôi "đặt lại" tổng khi data_binary bằng không? Dễ dàng! Tôi cắt tổng tích lũy nơi data_binary bằng 0 và chuyển tiếp điền vào các giá trị. Khi tôi lấy sự khác biệt giữa điều này và tổng tích luỹ, tôi đã đặt lại số tiền một cách hiệu quả.

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