2016-06-21 62 views
7

Tôi có DataFrame gấu trúc sau.Pandas: Cách tính tổng các cột dựa trên điều kiện của các giá trị cột khác?

import pandas as pd 
df = pd.read_csv('filename.csv') 

print(df) 

    dog  A   B   C 
0  dog1 0.787575 0.159330 0.053095 
1  dog10 0.770698 0.169487 0.059815 
2  dog11 0.792689 0.152043 0.055268 
3  dog12 0.785066 0.160361 0.054573 
4  dog13 0.795455 0.150464 0.054081 
5  dog14 0.794873 0.150700 0.054426 
.. .... 
8  dog19 0.811585 0.140207 0.048208 
9  dog2 0.797202 0.152033 0.050765 
10 dog20 0.801607 0.145137 0.053256 
11 dog21 0.792689 0.152043 0.055268 
    .... 

tôi tạo một cột mới bằng cách tổng hợp các cột "A", "B", "C" như sau:

df['total_ABC'] = df[["A", "B", "B"]].sum(axis=1) 

Bây giờ tôi muốn làm điều này dựa trên một điều kiện, tức là nếu "A" < 0.78 sau đó tạo ra một mới tóm gọn cột df['smallA_sum'] = df[["A", "B", "B"]].sum(axis=1). Nếu không, giá trị phải bằng 0.

Làm cách nào để tạo câu lệnh có điều kiện như thế này?

Suy nghĩ của tôi sẽ được sử dụng

df['smallA_sum'] = df1.apply(lambda row: (row['A']+row['B']+row['C']) if row['A'] < 0.78)) 

Tuy nhiên, điều này không làm việc và tôi không thể xác định trục.

Làm cách nào để bạn tạo cột dựa trên giá trị của các cột khác?

Bạn cũng có thể làm điều gì đó giống như đối với từng df['dog'] == 'dog2', tạo cột dog2_sum, ví dụ:

df['dog2_sum'] = df1.apply(lambda row: (row['A']+row['B']+row['C']) if df['dog'] == 'dog2')) 

nhưng cách tiếp cận của tôi là không chính xác.

'

Trả lời

5

Sau đây nên làm việc, ở đây chúng tôi che df nơi điều kiện được đáp ứng, điều này sẽ thiết lập NaN đến hàng nơi tình trạng này không được đáp ứng vì vậy chúng tôi gọi fillna trên col mới:

In [67]: 
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC')) 
df 

Out[67]: 
      A   B   C 
0 0.197334 0.707852 -0.443475 
1 -1.063765 -0.914877 1.585882 
2 0.899477 1.064308 1.426789 
3 -0.556486 -0.150080 -0.149494 
4 -0.035858 0.777523 -0.453747 

In [73]:  
df['total'] = df.loc[df['A'] > 0,['A','B']].sum(axis=1) 
df['total'].fillna(0, inplace=True) 
df 

Out[73]: 
      A   B   C  total 
0 0.197334 0.707852 -0.443475 0.905186 
1 -1.063765 -0.914877 1.585882 0.000000 
2 0.899477 1.064308 1.426789 1.963785 
3 -0.556486 -0.150080 -0.149494 0.000000 
4 -0.035858 0.777523 -0.453747 0.000000 

một cách khác là để gọi where trên sum kết quả, điều này mất một param trị trả về khi tình trạng này không được đáp ứng:

In [75]: 
df['total'] = df[['A','B']].sum(axis=1).where(df['A'] > 0, 0) 
df 

Out[75]: 
      A   B   C  total 
0 0.197334 0.707852 -0.443475 0.905186 
1 -1.063765 -0.914877 1.585882 0.000000 
2 0.899477 1.064308 1.426789 1.963785 
3 -0.556486 -0.150080 -0.149494 0.000000 
4 -0.035858 0.777523 -0.453747 0.000000 
+0

Giải pháp '.where()' là hoàn hảo! Cảm ơn – ShanZhengYang

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