2016-02-28 27 views
6

Tôi có một khung dữ liệu gấu trúc chứa dữ liệu phổ và siêu dữ liệu. Các cột được gắn nhãn bằng multiindex sao cho df['wvl'] cung cấp cho quang phổ và df['meta'] cung cấp siêu dữ liệu. Trong các nhãn df['wvl'] các nhãn cột là các giá trị bước sóng cho các kênh phổ kế.Bình thường hóa các hàng khung dữ liệu gấu trúc theo số tiền của chúng

Điều tôi muốn làm là chuẩn hóa mỗi hàng của df['wvl'] bằng tổng của hàng đó để cộng các giá trị trong hàng cho tổng cộng là 1.0.

Đây là những gì một hàng của dataframe trông giống như:

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

Nhưng khi tôi làm điều gì đó như:

df['wvl'].iloc[0]=df['wvl'].iloc[0]/df['wvl'].iloc[0].sum() 

Không có gì xảy ra! Tôi nhận được cùng một giá trị chính xác:

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

Nếu tôi có thể tạo một biến tạm thời để giữ liên tiếp, tôi có thể làm việc bình thường hóa tốt:

temp=df['wvl'].iloc[0] 

temp=temp/temp.sum() 

temp 
246.050003 0.000027 
246.102005 0.000022 
246.156006 0.000021 
       ... 
848.697205 0.000026 
848.896423 0.000027 
849.095703 0.000026 
Name: 0, dtype: float64 

Nhưng nếu tôi cố gắng để thay thế hàng dataframe với biến tạm thời được chuẩn hóa, không có gì xảy ra:

df['wvl'].iloc[0]=temp 

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
       ...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

Tôi rõ ràng thiếu thứ gì đó ở đây, nhưng tôi không thể hiểu được điều gì làm tôi phát điên. Cứu giúp? Cảm ơn trước!

+0

có thể trùng lặp của [Bình thường hoá một DataFrame gấu trúc bởi hàng] (https://stackoverflow.com/questions/18594469/normalizing-a-pandas-dataframe-by-row) –

Trả lời

10

Bạn có thể sử dụng

df.div(df.sum(axis=1), axis=0) 

df.sum(axis=1) tổng kết mỗi hàng; df.div(..., axis=0) rồi chia.

Ví dụ:

import pandas as pd 

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]}) 
>>> df.div(df.sum(axis=1), axis=0) 
    a b 
0 0.250000 0.750000 
1 0.333333 0.666667 
+0

Wow , tiếng Anh> Tiếng Việt! Cảm ơn! Bạn có thể giúp tôi hiểu tại sao những gì tôi đang làm không hoạt động? – rba

+0

@ eft773 Vì vậy, tôi leng keng xung quanh một chút, và có vẻ như 'iloc' đang trả về một bản sao, và do đó, sự phân công cho nó không thay đổi bất cứ điều gì. Điều này có giải quyết được câu hỏi của bạn không? –

+0

Ahh, tôi hiểu rồi. Tôi nghĩ nó có nghĩa. Vì vậy, về cơ bản 'df ['wvl']. Iloc [0]' không thực sự là một phần của df ['wvl'] nữa, vì vậy việc chỉnh sửa nó không làm gì với bản gốc. Cảm ơn bạn! – rba

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