2013-07-15 48 views
6

Xem xét dataframe sauSử dụng một từ điển để thay thế các giá trị cột trên số chỉ số đưa ra trên một dataframe gấu trúc

df_test = pd.DataFrame({'a' : [1, 2, 8], 'b' : [np.nan, np.nan, 5], 'c' : [np.nan, np.nan, 4]}) 
df_test.index = ['one', 'two', 'three'] 

mang đến cho

 a b c 
one 1 NaN NaN 
two 2 NaN NaN 
three 8 5 4 

Tôi có một cuốn từ điển của thay thế hàng cho cột b và c . Ví dụ:

{ 'one': [3.1, 2.2], 'two' : [8.8, 4.4] } 

nơi 3.1 và 8.8 Thay thế cột b và 2.2 và 4.4 Thay thế cột c, do đó kết quả là

 a b c 
one 1 3.1 2.2 
two 2 8.8 4.4 
three 8 5 4 

Tôi biết làm thế nào để thực hiện những thay đổi này với một vòng lặp for:

index_list = ['one', 'two'] 
value_list_b = [3.1, 8.8] 
value_list_c = [2.2, 4.4] 
for i in range(len(index_list)): 
    df_test.ix[df_test.index == index_list[i], 'b'] = value_list_b[i] 
    df_test.ix[df_test.index == index_list[i], 'c'] = value_list_c[i] 

nhưng tôi chắc chắn có cách sử dụng từ điển đẹp hơn và nhanh hơn!

Tôi đoán nó có thể được thực hiện với phương pháp DataFrame.replace, nhưng tôi không thể tìm ra.

Thanks for the help,

cd

Trả lời

4

Bạn đang tìm kiếm DataFrame.update. Bước ngoặt duy nhất trong trường hợp của bạn là bạn chỉ định các cập nhật làm từ điển của các hàng, trong khi một DataFrame thường được xây dựng từ một từ điển các cột. Từ khóa orient có thể xử lý điều đó.

In [25]: df_test 
Out[25]: 
     a b c 
one 1 NaN NaN 
two 2 NaN NaN 
three 8 5 4 

In [26]: row_replacements = { 'one': [3.1, 2.2], 'two' : [8.8, 4.4] } 

In [27]: df_update = DataFrame.from_dict(row_replacements, orient='index') 

In [28]: df_update.columns = ['b', 'c'] 

In [29]: df_test.update(df_update) 

In [30]: df_test 
Out[30]: 
     a b c 
one 1 3.1 2.2 
two 2 8.8 4.4 
three 8 5.0 4.0 

from_dict là một constructor DataFrame cụ thể cho chúng ta orient từ khóa, không khả dụng nếu bạn chỉ nói DataFrame(...). Vì lý do tôi không biết, chúng tôi không thể chuyển tên cột ['b', 'c'] đến from_dict, vì vậy tôi đã chỉ định chúng trong bước riêng biệt.

+0

Điều này phù hợp với tôi, cảm ơn rất nhiều! – cd98

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