Python pandas,特定系列数据的乘法

时间:2014-01-29 17:14:31

标签: python csv pandas

想象一下,我打开2个.csv文件,使2个数组包含与不同类型对象相关的不同类型的数据。

一个是对象列表:

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 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'])

根据类型区分对象的首选语法是什么?

换句话说,如何翻译这个伪代码:

  
    

对于所有猫,按照文件/列表'H2O_percentage.csv'中的说明进行测量* H20_percent

  

编辑:

第二个问题:serial_number告诉我“1表示第一次测量,2表示次级测量,等等。”

如何单独计算所有单个测量值(想象有数百个'em ...)?

由于

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

答案 1 :(得分: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 [res ['serialNumber'] == 1]允许你只选择serialNumber == 1的行索引。现在有了这个想法,你可以根据serialNumber中的值进行单独的计算。如果“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"])

apply函数类似于内置“map”的pythons。您可以在行或列上“应用”相同的函数(其中axis = 1用于行[从上到下],其中索引将是列名称,而axis = 0是按列[从左到右]其中行索引是索引)