2014-01-29 98 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是列式[从左到右]行索引是索引)