2014-04-08 26 views
11

Tôi có file Excel với nhiều tờ, mỗi trong số đó trông một chút như thế này (nhưng lâu hơn nữa):Pandas: Đọc Excel với các tế bào sáp nhập

 Sample CD4  CD8 
Day 1 8311 17.3 6.44 
     8312 13.6 3.50 
     8321 19.8 5.88 
     8322 13.5 4.09 
Day 2 8311 16.0 4.92 
     8312 5.67 2.28 
     8321 13.0 4.34 
     8322 10.6 1.95 

Cột đầu tiên thực sự là bốn tế bào sáp nhập theo chiều dọc.

Khi tôi đọc này sử dụng pandas.read_excel, tôi nhận được một DataFrame trông như thế này:

 Sample CD4 CD8 
Day 1 8311 17.30 6.44 
NaN  8312 13.60 3.50 
NaN  8321 19.80 5.88 
NaN  8322 13.50 4.09 
Day 2 8311 16.00 4.92 
NaN  8312 5.67 2.28 
NaN  8321 13.00 4.34 
NaN  8322 10.60 1.95 

Làm thế nào tôi có thể nhận được một trong hai Pandas hiểu tế bào sáp nhập, hoặc một cách nhanh chóng và dễ dàng loại bỏ các NaN và nhóm bằng giá trị thích hợp? (Một cách tiếp cận sẽ được thiết lập lại chỉ mục, bước qua để tìm các giá trị và thay thế NaN với các giá trị, vượt qua trong danh sách ngày, sau đó thiết lập chỉ số cho cột. Nhưng có vẻ như cần có một cách tiếp cận đơn giản hơn.)

Trả lời

18

Bạn có thể sử dụng phương pháp Series.fillna để forword-điền vào các giá trị NaN:

df.index = pd.Series(df.index).fillna(method='ffill') 

Ví dụ,

In [42]: df 
Out[42]: 
     Sample CD4 CD8 
Day 1 8311 17.30 6.44 
NaN  8312 13.60 3.50 
NaN  8321 19.80 5.88 
NaN  8322 13.50 4.09 
Day 2 8311 16.00 4.92 
NaN  8312 5.67 2.28 
NaN  8321 13.00 4.34 
NaN  8322 10.60 1.95 

[8 rows x 3 columns] 

In [43]: df.index = pd.Series(df.index).fillna(method='ffill') 

In [44]: df 
Out[44]: 
     Sample CD4 CD8 
Day 1 8311 17.30 6.44 
Day 1 8312 13.60 3.50 
Day 1 8321 19.80 5.88 
Day 1 8322 13.50 4.09 
Day 2 8311 16.00 4.92 
Day 2 8312 5.67 2.28 
Day 2 8321 13.00 4.34 
Day 2 8322 10.60 1.95 

[8 rows x 3 columns] 
+0

"ffill" là chính xác những gì tôi đang tìm kiếm. Cảm ơn. – iayork

+0

Bạn sẽ giải quyết vấn đề tương tự như thế nào cho các cột được hợp nhất thay vì các hàng? –

+0

@SamarthBharadwaj: Phương pháp ['fillna'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html) có tham số' trục' điều khiển hướng được đầy. Để điền vào tất cả các NaN trong một hàng DataFrame, bạn có thể sử dụng 'df = df.fillna (method = 'ffill', axis = 1)'. Để chỉ điền vào các hàng đã chọn, sử dụng 'df.loc' hoặc' df.iloc'. Ví dụ, 'df.loc [mask] = df.loc [mặt nạ] .fillna (phương thức = 'ffill', trục = 1)'. – unutbu

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