2014-01-29 96 views
0

想象一下,我打開2 .csv文件,使2個數組包含與不同類型的對象有關的不同類型的數據。Python熊貓,特定系列數據的乘法

一個是對象的列表:

object_type measurement name serialNumber 
cat   6.3   bill 1 
cat   7.1   kitty 1 
whale  25678  none 1 
dog   11.1   none 1 
dolphin  200.8  none 1 
cat   6.1   bill 2 
cat   7   kitty 2 
whale  25121  none 2 
dog   12.1   none 2 
dolphin  200   none 2 

另外一個告訴我的水的百分比,身體的若干動物 :

object-type H2O_percent 
dog   66 
cat   66 
whale  75 
dolphin  75 
jellyfish 98 

我的功能將成倍measurement通過H2O_percent在功能 of object-type

讓我們先讓這段代碼:

import pandas as pd 

object_list = pd.read_csv('animals.csv', names=['object_type', 'measurement', 'name', 'serialNumber']) 
percentages = pd.read_csv('H2O_percentage.csv', names=['wavelength', 'a', 'b']) 

區分對象類型的首選語法是什麼?

換句話說,如何翻譯這個僞代碼:

爲所有的貓,做測量* H20_percent在文件/目錄說明 'H2O_percentage.csv'

編輯:

第二個問題:serial_number在這裏告訴我「1意味着第一個mea保證,2次測量等。「

我怎樣才能分別計算所有的個人測量(想象有數以百計的時間...)?

感謝

+0

你期待什麼輸出「分別計算所有的個人測量」 –

回答

1

試試這個:

res = pd.merge(object_list,percentages,left_on='object_type',right_on='object-type') 
res['water'] = res['measurement'] * res['H2O_percent'] 

不知道你想在你的第二個問題是什麼,但你可以試試這個,看看是否有幫助:

for i,g in res.groupby(['object_type','name']): 
    print "="*80 
    print g 
    print "="*80 
+0

謝謝,你可以檢查第二個問題,問題變得更加清晰... –

0

在問候到第二個問題: 您是否試圖根據serialNumber中的值應用兩種不同類型的公式?

在object_list和百分比之間合併後,您可以根據serialNumber中的值「查詢」數據框並應用正確的公式;

# object_list columns -> ['object-type','measurement','name','serialNumber'] 
# percentages columns -> ['object-type','H2O_percent'] 

# Merge the two dataframe on object-type and save the result as res 
res = pd.merge(object_list,percentages,how='inner',on=['object_type']) 
# res columns -> ['object-type','measurement','name','serialNumber','H2O_percent'] 

# Create a new column for the results and default it to 0.0 
res['water'] = 0.0 
# For all rows that have serialNumber equal to 1 -- do calculations 
res['water'][res['serialNumber'] == 1] = \ 
        res['measurement'][res['serialNumber'] == 1] * \ 
        res['H2O_percent'][res['serialNumber'] == 1] 
# For all rows that have serialNumber equal to 2 -- do calculations 
res['water'][res['serialNumber'] == 2] = \ 
        res['measurement'][res['serialNumber'] == 2] * \ 
        res['H2O_percent'][res['serialNumber'] == 2] 

這裏的資源[RES [「SERIALNUMBER」] == 1]將允許你只選擇行的索引,其中SERIALNUMBER == 1,現在有了這個想法基於價值,你可以做一個獨立的計算序列號。如果「measurement_1」和「measurement_2」會有不同的列,則可以簡單地將列名更改爲乘以。

另外,如果你將應用同樣的計算,但僅根據序列號改變測量列,並在object_list中的列名,如:

['object-type','measurement_1','measurement_2','name','serialNumber'] 

凡序列號對應的測量列,那麼你也可以做這樣的事情:

res['water'] = res.apply(axis=1, func=lambda x: x["measurement_%i"%(x['serialNumber'])] * x["H2O_percent"]) 

的應用功能類似蟒蛇內置的「地圖」。您可以在行或列上應用相同的函數(其中axis = 1是行向[從上到下],其中索引將作爲列名稱,而axis = 0是列式[從左到右]行索引是索引)