2012-05-25 46 views
42

Tôi đang sử dụng một Pandas DataFrame để làm một t-test hàng khôn ngoan theo ví dụ này:Trở nhiều giá trị từ gấu trúc được áp dụng trên DataFrame

import numpy 
import pandas 

df = pandas.DataFrame(numpy.log2(numpy.randn(1000, 4), 
         columns=["a", "b", "c", "d"]) 

df = df.dropna() 

Bây giờ, giả sử tôi có "a" và " b "như là một nhóm, và" c "và" d "ở bên kia, tôi đang thực hiện thử nghiệm hàng t-test. Điều này là khá tầm thường với gấu trúc, sử dụng apply với trục = 1. Tuy nhiên, tôi có thể trả về một DataFrame có cùng hình dạng nếu hàm của tôi không tổng hợp hoặc một Chuỗi nếu tổng hợp.

Thông thường tôi sẽ chỉ xuất giá trị p (vì vậy, tổng hợp) nhưng tôi muốn tạo thêm giá trị dựa trên các phép tính khác (nói cách khác, trả về hai giá trị). Dĩ nhiên tôi có thể thực hiện hai lần chạy, tổng hợp các giá trị p trước, sau đó thực hiện công việc khác, nhưng tôi đã tự hỏi liệu có cách nào hiệu quả hơn để làm như vậy vì dữ liệu là hợp lý lớn không.

Như một ví dụ về tính toán, một chức năng hypotethical sẽ là:

from scipy.stats import ttest_ind 

def t_test_and_mean(series, first, second): 
    first_group = series[first] 
    second_group = series[second] 
    _, pvalue = ttest_ind(first_group, second_group) 

    mean_ratio = second_group.mean()/first_group.mean() 

    return (pvalue, mean_ratio) 

Sau đó gọi với

df.apply(t_test_and_mean, first=["a", "b"], second=["c", "d"], axis=1) 

Tất nhiên trong trường hợp này nó trả về một dòng duy nhất với hai bộ dữ liệu như giá trị .

Thay vào đó, đầu ra được mong đợi sẽ là một DataFrame có hai cột, một cột cho kết quả đầu tiên và một cho cột thứ hai. Điều này có thể hoặc tôi phải thực hiện hai lần chạy cho hai phép tính, sau đó hợp nhất chúng lại với nhau?

+3

Tại sao bạn sử dụng 'áp dụng' ngay từ đầu? Kết quả của bạn là một 'DataFrame' mới với một hình dạng khác với đầu vào (cả hàng và cột), do đó nó là một obj hoàn toàn mới. Bạn chỉ có thể 't_test_and_mean' chấp nhận dataframe đầu vào của bạn (và các cột để nhóm theo) và trả về một dataframe 1-row-2-cột, mà không sử dụng' apply'. – lbolla

+1

@ lbolla Phải, cuối cùng tôi đã làm điều đó trong mã của tôi, cuối cùng. – Einar

Trả lời

59

Trả về một chuỗi, thay vì tuple, nên tạo một DataFrame nhiều cột mới. Ví dụ:

return pandas.Series({'pvalue': pvalue, 'mean_ratio': mean_ratio}) 
+0

Tôi sẽ thử lại vào thứ hai, nhưng nếu tôi nhớ chính xác nó cố gắng ép buộc cấu trúc cột ban đầu (do đó kết thúc bằng NA). – Einar

+0

@garrett - Làm cách nào để đảm bảo rằng hàng được trả về từ một hàm sẽ giữ lại thứ tự "dự kiến" của nó. Trường hợp sử dụng của tôi là đăng bài trả về chuỗi này từ một hàm, tôi đang lưu nó vào tệp csv bằng df.to_csv. Khác với ofcourse là câm, và đặt tên chúng như A, B, C, D để giữ lại trật tự tự nhiên của nó trong tập tin csv. – ekta

+4

để chỉ định thứ tự cột, hãy thử xây dựng chuỗi với danh sách thay vì dict, ví dụ: 'pandas.Series ([pvalue, mean_ratio], index = ['pvalue', 'mean_ratio'])' – Garrett

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