2016-06-21 43 views
7

Aşağıdaki pandalar DataFrame'im var. aşağıdaki gibi Pandalar: Diğer sütun değerlerine göre sütunlar nasıl hesaplanır?

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 
    .... 

Ben, sütunlar "A", "B" toplayarak "C" yeni bir sütun oluşturun:

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

ben "A" < 0.78 sonra özetlenebilir yeni oluşturursanız yani şartlı dayalı Bunu yapmak istiyoruz sütun df['smallA_sum'] = df[["A", "B", "B"]].sum(axis=1). Aksi halde, değer sıfır olmalıdır.

Böyle bir koşullu ifadeler nasıl oluşturulur?

Benim düşünce Ancak, bu işe yaramazsa ve ben eksenini belirlemek mümkün değilim

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

kullanmak olacaktır.

Diğer sütunların değerlerini temel alarak bir sütun nasıl oluşturulur?

Ayrıca, sütun dog2_sum oluşturmak, her df['dog'] == 'dog2' için böyle bir şey yapabileceğini yani

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

ama benim yaklaşım yanlıştır.

`

cevap

5

biz bu yeni col fillna diyoruz durum o kadar karşılanmazsa satırlara NaN ayarlayacaktır koşul karşılandığında df maske burada, çalışmalıdır:

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 

başka bir yaklaşım sum sonucu where aramaktır, bu koşul karşılanmadığında dönmek için bir değer param alır:

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

'.where()' çözümü mükemmel! Teşekkürler – ShanZhengYang