2015-03-27 20 views
5

Tôi có khung dữ liệu sau:Áp dụng chức năng hàng khôn ngoan trên khung dữ liệu gấu trúc trên các cột với các giá trị số

import pandas as pd 
df = pd.DataFrame({'AAA' : ['w','x','y','z'], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}) 

nào trông như thế này:

In [32]: df 
Out[32]: 
    AAA BBB CCC 
0 w 10 100 
1 x 20 50 
2 y 30 -30 
3 z 40 -50 

Những gì tôi muốn làm là để thực hiện hoạt động chức năng trên mỗi hàng cho mỗi cột ngoại trừ các giá trị không có giá trị số (trong trường hợp này là AAA). Trong trường hợp thực, trường hợp không phải số là luôn luôn trên cột đầu tiên, và phần còn lại (có thể lớn hơn 2 cột) luôn luôn là số.

Kết quả mong muốn cuối cùng là:

AAA BBB CCC Score 
0 w 10 100 110 
1 x 20 50 70 
2 y 30 -30 0 
3 z 40 -50 -10 

tôi đã cố gắng này, nhưng thất bại:

import numpy as np 
df["Score"] = df.apply(np.sum, axis=1) 

đúng cách để làm điều đó là gì?

Update2:

Đây là mã mà cho SettingWithCopyWarning. Vui lòng khởi động ipython mới để thử nghiệm.

import pandas as pd 
import numpy as np 
def cvscore(fclist): 
    sd = np.std(fclist) 
    mean = np.mean(fclist) 
    cv = sd/mean 
    return cv 

def calc_cvscore_on_df(df): 
    df["CV"] = df.iloc[:,1:].apply(cvscore, axis=1) 
    return df 

df3 = pd.DataFrame(np.random.randn(1000, 3), columns=['a', 'b', 'c']) 
calc_cvscore_on_df(df3[["a","b"]]) 

Trả lời

12

Để chọn tất cả mọi thứ nhưng cột đầu tiên, bạn có thể sử dụng df.iloc[:, 1:]:

In [371]: df['Score'] = df.iloc[:, 1:].sum(axis=1) 

In [372]: df 
Out[372]: 
    AAA BBB CCC Score 
0 w 10 100 110 
1 x 20 50  70 
2 y 30 -30  0 
3 z 40 -50 -10 

Để áp dụng một chức năng tùy ý, func, để mỗi hàng:

df.iloc[:, 1:].apply(func, axis=1) 

Đối ví dụ:

import numpy as np 
import pandas as pd 

def cvscore(fclist): 
    sd = np.std(fclist) 
    mean = np.mean(fclist) 
    cv = sd/mean 
    return cv 

df = pd.DataFrame({'AAA' : ['w','x','y','z'], 'BBB' : [10,20,30,40], 
        'CCC' : [100,50,-30,-50]}) 

df['Score'] = df.iloc[:, 1:].apply(cvscore, axis=1) 
print(df) 

mang

AAA BBB CCC  Score 
0 w 10 100 1.211386 
1 x 20 50 0.868377 
2 y 30 -30  NaN 
3 z 40 -50 -5.809058 
+1

càu nhàu. Bạn có biết một cách tốt hơn để xử lý các trường hợp chung (nơi chúng tôi không nhất thiết phải biết những cột nào là số trước) hơn 'df.select_dtypes (include = [np.number]). Sum (axis = 1)'? – DSM

+0

@unutbu: Làm cách nào tôi có thể khái quát hóa chức năng chung đó. Trong thực tế, nó không phải là 'np.sum' mà là hàm cụ thể khác của tôi. Xem cập nhật. – pdubois

+0

@DSM: 'df.select_dtypes (bao gồm = [np.number]). Tổng (trục = 1)' có vẻ như một câu trả lời vượt trội. Những gì bạn không thích về nó? – unutbu

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